Von Menü: Seite zu Seite springen (CardLayout)

internet

Top Contributor
Hallo,

ich versuche mich gerade mit Swing und habe ier auch den Windows Builder in Eclipse installiert.
Ich scheitere aber gerade bei einem "Seitenwechsel".

Also sowas möche ich machen:
- Je nachdem wo man draufklickt wird in dem "Contentbereich" Seite1 oder Seite2 angezeigt.
1656574877350.png

Aber das funktioniert nicht.

Java:
public class MainWindow {

    private JFrame frame;
    private JTextField textField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainWindow window = new MainWindow();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public MainWindow() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
    
        frame = new JFrame("Test");
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        EventQueue.invokeLater(() -> frame.setVisible(true));
        
        
        JPanel cardLayout = new JPanel(new CardLayout());
        GridBagConstraints gbcCards = new GridBagConstraints();
        gbcCards.gridx = 0;
        gbcCards.gridy = 1;
        gbcCards.gridwidth = 2;
        gbcCards.fill = java.awt.GridBagConstraints.BOTH;
        gbcCards.weightx = 1.0;
        gbcCards.weighty = 1.0;
        frame.getContentPane().add(cardLayout);
        
        final JPanel panel = new JPanel(new FlowLayout());
        cardLayout.add(panel, "page1");
        
        textField = new JTextField();
        textField.setBounds(277, 5, 130, 26);
        panel.add(textField);
        textField.setColumns(10);

        
        final JPanel panel_1 = new JPanel(new FlowLayout());
        cardLayout.add(panel_1, "page2");
        
        JLabel lblNewLabel = new JLabel("New label");
        lblNewLabel.setBounds(311, 5, 61, 16);
        panel_1.add(lblNewLabel);
        
        ItemListener buttonSelectListener = (ItemEvent e) -> {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                showCard(((AbstractButton) e.getSource()).getActionCommand(), cardLayout);
            }
        };
        
        //////////
        // Menu
        //////////
        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);
        
        JMenu mnNewMenu_2 = new JMenu("Allgemein");
        menuBar.add(mnNewMenu_2);
        
        JMenuItem mntmNewMenuItem = new JMenuItem("Dashboard");
        mntmNewMenuItem.setActionCommand("page1");
        mntmNewMenuItem.addItemListener(buttonSelectListener);
        mnNewMenu_2.add(mntmNewMenuItem);
        
        JMenuItem mntmNewMenuItem_2 = new JMenuItem("Einstellung");
        mntmNewMenuItem_2.setActionCommand("page2");
        mntmNewMenuItem_2.addItemListener(buttonSelectListener);
        mnNewMenu_2.add(mntmNewMenuItem_2);
    

    }


    /**
     * holder muss ein CardLayout haben
     *
     * @param key
     * @param holder
     */
    private void showCard(String key, JPanel holder) {
        ((CardLayout) holder.getLayout()).show(holder, key);
    }

Was mache ich falsch?
 

Neumi5694

Top Contributor
So weit ich das beurteilen kann, hast du das panel aber schon mal richtig initialisiert und befüllt. showCard schaut auch gut aus

Für normale MenüItems solltest du einen Actionlistener verwenden. ItemListener sind z.B. für Radiomenuitems gedacht.

Lass dir dort, wo showCard aufgerufen wird, mal was ausgeben, damit du siehst, ob der Punkt überhaupt erreicht wird.


edit: Post korrigiert, hatte was übersehen.
 

volcanos

Bekanntes Mitglied
Java:
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


// BoxLayout (Außen) mit CardLayout (Innen):
public class BoxLayoutDemo extends JFrame
{   
    JPanel cardPanel = new JPanel(); 
    JPanel dokuPanel = new JPanel();
    JLabel dokuLabel = new JLabel("Das ist die Dokumentation über die Toyota-Serie...");
    
    ImageIcon pic1 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Corolla.png");   
    ImageIcon pic2 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Yaris_Cross.png");
    ImageIcon pic3 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Rav4.png");
    ImageIcon pic4 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Highlander.png");
    ImageIcon pic5 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Kleinbus.png");
    ImageIcon pic6 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Supra.png");
    Image picFuchs = Toolkit.getDefaultToolkit().getImage("E:/NetBeansProjects/BoxLayoutDemo/Silberfuchs-Wappen_java.png");
      
    public BoxLayoutDemo(String title)
    {       
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));       
        
        // 1. Horizontale Box (HEADERBOX) erzeugen:
        Box headerBox = Box.createHorizontalBox();
        headerBox.add(new JLabel("TOYOTA-SERIE"));
        this.add(headerBox);
        
        // 2. Horizontale Box (BUTTONBOX) erzeugen:
        Box buttonBox = Box.createHorizontalBox();
        buttonBox.add(Box.createRigidArea(new Dimension(10, 0)));
        JButton dokuButton = new JButton("DOKU");
        buttonBox.add(dokuButton);
        // alle Komponenten so weit wie möglich nach links oder rechts verschieben:
        buttonBox.add(Box.createHorizontalGlue());
        JButton weiterButton = new JButton("WEITER");
        buttonBox.add(weiterButton);
        buttonBox.add(Box.createRigidArea(new Dimension(10, 0)));
        this.add(buttonBox);         
        
        // 3. Horizontale Box (ICONBOX) erzeugen:
        Box iconBox = Box.createHorizontalBox();
        // alle Komponenten so weit wie möglich nach links oder rechts verschieben:
        iconBox.add(Box.createHorizontalGlue());
        CardLayout carLa = new CardLayout(100, 50);
        cardPanel.setLayout(carLa);
        cardPanel.setBackground(Color.BLACK);
        cardPanel.add(new JLabel(pic1));
        cardPanel.add(new JLabel(pic2));
        cardPanel.add(new JLabel(pic3));
        cardPanel.add(new JLabel(pic4));
        cardPanel.add(new JLabel(pic5));
        cardPanel.add(new JLabel(pic6));
        iconBox.add(cardPanel);
        this.add(iconBox);           
              
        // 4. Horizontale Box (EXITBOX) erzeugen:
        Box exitBox = Box.createHorizontalBox();
        // alle Komponenten so weit wie möglich nach links oder rechts verschieben:
        exitBox.add(Box.createHorizontalGlue());
        JButton exitButton = new JButton("EXIT");
        exitBox.add(exitButton);
        exitBox.add(Box.createHorizontalGlue());
        this.add(exitBox);
        // ExitButton:
        exitButton.addActionListener(AE ->
        { System.exit(0); });
        exitButton.addKeyListener(new KeyAdapter()
        {
            @Override
            public void keyPressed(KeyEvent e)
            {
                if (e.getKeyCode() == KeyEvent.VK_ENTER)
                { System.exit(0); }   
            }
        }); 
        
        // weiterButton -> addActionListener:
        weiterButton.addActionListener(AE ->
        {
            carLa.next(cardPanel);
            cardPanel.remove(dokuPanel);
        });         
        
        // weiterButton -> addKeyListener:
        weiterButton.addKeyListener(new KeyAdapter()
        {
            @Override
            public void keyPressed(KeyEvent e)
            {
                if (e.getKeyCode() == KeyEvent.VK_RIGHT)
                {
                    carLa.next(cardPanel);
                    cardPanel.remove(dokuPanel);                   
                }   
            }
        });
        
        // dokuButton -> CardLayout show (carLa.show):
        dokuButton.addActionListener((ActionEvent AE) ->
        {
            dokuPanel.add(dokuLabel);       
            cardPanel.add(dokuPanel, "se_llama_DOKU");
            carLa.show(cardPanel, "se_llama_DOKU");       
        });
              
        // Finale:
        BoxLayoutDemo.setDefaultLookAndFeelDecorated(true);
        this.setIconImage(picFuchs);
        this.pack();
        this.setVisible(true);
    } 
    
        
    // Main:
    public static void main(String... args)
    {
        SwingUtilities.invokeLater(() ->
        { new BoxLayoutDemo("BoxLayout mit CardLayout"); });
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
@volcanos Schau Dir einmal an, wie man mit Ressourcen in Java umgeht. Code wie:
Java:
    ImageIcon pic1 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Corolla.png");   
    ImageIcon pic2 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Yaris_Cross.png");
    ImageIcon pic3 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Rav4.png");
    ImageIcon pic4 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Highlander.png");
    ImageIcon pic5 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Kleinbus.png");
    ImageIcon pic6 = new ImageIcon("E:/NetBeansProjects/BoxLayoutDemo/Toyota_Supra.png");
    Image picFuchs = Toolkit.getDefaultToolkit().getImage("E:/NetBeansProjects/BoxLayoutDemo/Silberfuchs-Wappen_java.png");
ist mit das Schlechteste, das man machen kann. Je nach Projekt ist die Frage, wo die Ressourcen erwartet werden. Wenn NetBeans kein eigenes Verzeichnis hat, dann wäre das obere besser zu schreiben als:
Java:
    ImageIcon pic1 = new ImageIcon(getClass().getResource("/Toyota_Corolla.png"));   
    ImageIcon pic2 = new ImageIcon(getClass().getResource("/Toyota_Yaris_Cross.png"));
    ImageIcon pic3 = new ImageIcon(getClass().getResource("/Toyota_Rav4.png"));
    ImageIcon pic4 = new ImageIcon(getClass().getResource("/Toyota_Highlander.png"));
    ImageIcon pic5 = new ImageIcon(getClass().getResource("/Toyota_Kleinbus.png"));
    ImageIcon pic6 = new ImageIcon(getClass().getResource("/Toyota_Supra.png"));
    Image picFuchs = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/Silberfuchs-Wappen_java.png"));

Das funktioniert dann auch wenn die Ressourcen mit in der Jar Datei sind und so. Und vor allem hast Du keine fest codierten Pfade. Bei mir wird es so schnell kein e:\NetBeans\Projects geben und so Linux und Apple nicht massiv was verändern wird es auch Anderen ebenso gehen.
 

Neumi5694

Top Contributor
ist mit das Schlechteste, das man machen kann. Je nach Projekt ist die Frage, wo die Ressourcen erwartet werden. Wenn NetBeans kein eigenes Verzeichnis hat, dann wäre das obere besser zu schreiben als:
Nur als Info: In einem ANT Projekt wird in Netbeans ein src und ein resources Ordner angelegt (bei Maven musste ich das manuell machen), um beides voneinenader zu trennen, sie sind aber - den Zugriff auf Resourcen betreffend - gleichwertig. Im Build Script wird der Inhalt des Resources-Verzeichnis dann auf Wunsch mit in die JAR gepackt.
Der oben verwendete Pfad kommt nur zustande, wenn man das resources-Verzeichnis nicht nutzt.

Was ich am Standard nicht gut finde, ist, dass - sofern man nichts anderes angibt - das Projektverzeichnis als Ausführungsverzeichnis verwendet wird. Hier hab ich mir ein eigenes angelegt, damit das Projekt auf keinen Fall durch die Ausführung verändert wird.

@volcanos
Egal was man verwendet: Resourcen direkt im Projektverzeichnis sind ... suboptimal.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J GUI Programmierung Popup-Menü AWT, Swing, JavaFX & SWT 4
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
B Swing Menü geht nicht AWT, Swing, JavaFX & SWT 5
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
H Swing Auf Klick auf Menü-Eintrag reagieren AWT, Swing, JavaFX & SWT 0
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1
M Menü ohne Menübar umsetzen[SWT] AWT, Swing, JavaFX & SWT 8
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4
D javafx.scene.control.TreeView als dropdown Menü AWT, Swing, JavaFX & SWT 6
G JavaFX Menü und mehrere Scenes AWT, Swing, JavaFX & SWT 16
J Swing aufklappbares Menü AWT, Swing, JavaFX & SWT 0
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
F Swing Ein 2D-Game Menü mit framefüllenden Button AWT, Swing, JavaFX & SWT 6
J 2D-Grafik Menü programmieren AWT, Swing, JavaFX & SWT 2
X Popup Menü nur bei besonderem Fall öffnen AWT, Swing, JavaFX & SWT 3
U Größe eines Button im Menü ändern AWT, Swing, JavaFX & SWT 1
M Menü mit Buttons AWT, Swing, JavaFX & SWT 8
J Graphisches Game Menü AWT, Swing, JavaFX & SWT 9
J Maus "locken" für Menü AWT, Swing, JavaFX & SWT 8
S SWT: Drop-Down Menü-Einträge mit Tooltip hervorheben AWT, Swing, JavaFX & SWT 3
H Swing Menü mit Bildern AWT, Swing, JavaFX & SWT 2
C Swing Wie kann ich im Programm das Menü schließen AWT, Swing, JavaFX & SWT 2
D Jtable mit Dropdown Menü erweitern funktioniert nicht AWT, Swing, JavaFX & SWT 5
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
J Menü umstrukutierem AWT, Swing, JavaFX & SWT 5
P versch. JPanel Klassen über Menü öffnen AWT, Swing, JavaFX & SWT 12
R Bitte kein Menü bei F10 AWT, Swing, JavaFX & SWT 9
A Swing Fenstergröße mittels Menü verändern AWT, Swing, JavaFX & SWT 3
kodela Tastaturereignisse für Menü- und Anwenderbereich AWT, Swing, JavaFX & SWT 14
TheWhiteShadow Swing Problem mit Icon-Menü-Leiste AWT, Swing, JavaFX & SWT 5
E Windows Kontext Menü - Laufendes Programm AWT, Swing, JavaFX & SWT 3
G Menü verschwindet durch .setText() AWT, Swing, JavaFX & SWT 4
J Swing Natives Menü unter OS X erstellen ? AWT, Swing, JavaFX & SWT 8
J Menü beschriftung wird nicht verändert AWT, Swing, JavaFX & SWT 7
J LookAndFeel Titelbar & About Menü AWT, Swing, JavaFX & SWT 6
Eldorado Swing Popup-Menü mit Jspinner AWT, Swing, JavaFX & SWT 4
Semox Swing Shortcuts in Menü realisieren AWT, Swing, JavaFX & SWT 2
R Swing Menü wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
Semox Swing Menü und JPanel AWT, Swing, JavaFX & SWT 6
S Menü Item "abhaken" lassen vom Benutzer AWT, Swing, JavaFX & SWT 2
G Swing Fortschrittsbalken im Fenster: Menü deaktivieren / abfangen? AWT, Swing, JavaFX & SWT 27
L Verzeichnis Menü (Durchsuchen) AWT, Swing, JavaFX & SWT 2
R JRadioButtonGroup - im Menü und im losgelösten Fenster AWT, Swing, JavaFX & SWT 3
J JButton und Menü AWT, Swing, JavaFX & SWT 5
S Dropdown-Menü wie auf der Eclipse-Toolbar AWT, Swing, JavaFX & SWT 7
T einfaches Menü in swing das nicht herunterklappt? AWT, Swing, JavaFX & SWT 4
M Menü mit Layout AWT, Swing, JavaFX & SWT 10
N Fenster mit Menü AWT, Swing, JavaFX & SWT 5
V Menüeinträge im DropDown-Menü deaktivieren AWT, Swing, JavaFX & SWT 3
B Applet Menü AWT, Swing, JavaFX & SWT 6
B Dropdown-Menü im Explorer AWT, Swing, JavaFX & SWT 4
E Anfänger-JPanel aus Menü aufrufen AWT, Swing, JavaFX & SWT 4
T Scrollbalken für ein Menü oder laufendes Dropdown-Menü wie? AWT, Swing, JavaFX & SWT 34
G Funktion für PopUp Menü AWT, Swing, JavaFX & SWT 32
ElViZ JCheckBoxMenuItem Problem - Menü soll offen bleiben. AWT, Swing, JavaFX & SWT 3
S Menü AWT, Swing, JavaFX & SWT 31
L F10 Taste öffnet das Menü AWT, Swing, JavaFX & SWT 7
M Combobox verdeckt Menü AWT, Swing, JavaFX & SWT 2
T Windows-Typisches Menü für Swing AWT, Swing, JavaFX & SWT 3
D Chinesisches Menü AWT, Swing, JavaFX & SWT 6
D Pulldown Menü erstellen; welche Klasse? AWT, Swing, JavaFX & SWT 2
T Tray-Icon-Menü unter Linux AWT, Swing, JavaFX & SWT 10
J Context Menü Maus AWT, Swing, JavaFX & SWT 3
welterde Menü in der Titelleiste des JInternalFrame AWT, Swing, JavaFX & SWT 4
T Popup-Menü unter Linux AWT, Swing, JavaFX & SWT 2
G Swing Menü Hauptfenster AWT, Swing, JavaFX & SWT 14
K Menü mit ALT-D öffnen AWT, Swing, JavaFX & SWT 13
M Ereignis: Menü offen? AWT, Swing, JavaFX & SWT 2
J Icons mit Text als Menü AWT, Swing, JavaFX & SWT 2
G Problem mit Kontextmenu(Popup Menü) AWT, Swing, JavaFX & SWT 3
G Menü hervorheben, wenn Item ausgewählt ist? AWT, Swing, JavaFX & SWT 2
B Menü-Bedienung mit Keys unter AWT! AWT, Swing, JavaFX & SWT 3
J Drop-down menü in Toolbar Button AWT, Swing, JavaFX & SWT 8
G Rechte Maustaste soll Menü aufrufen AWT, Swing, JavaFX & SWT 11
G Problem mit Menü/Button auf Hintergrundbild AWT, Swing, JavaFX & SWT 10
G Datei per Menü laden und und in JTextArea darstellen AWT, Swing, JavaFX & SWT 4
A Fenster über Menü schließen AWT, Swing, JavaFX & SWT 2
G Menü oder Layout? AWT, Swing, JavaFX & SWT 2
P Menü soll sich nur nach links aufbauen... AWT, Swing, JavaFX & SWT 7
I Swing: Menü verschwindet beim Einfügen eines Bildes AWT, Swing, JavaFX & SWT 15
J JTextField immer über Menü der JComboBox gezeichnet AWT, Swing, JavaFX & SWT 2
G menü AWT, Swing, JavaFX & SWT 9
C ActionListener für dynamisches Menü AWT, Swing, JavaFX & SWT 8
G Wie kann man ein Kontext-Menü erstellen? AWT, Swing, JavaFX & SWT 2
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
G JavaFX Scene ausdrucken nicht möglich, Seite leer AWT, Swing, JavaFX & SWT 5
I GUI, das verschiedene Panels hat (Von Seite zu Seite navigieren) AWT, Swing, JavaFX & SWT 7
P Zwei JTables auf eine A4-Seite mit einstellbaren Rändern AWT, Swing, JavaFX & SWT 9
B JavaFX Wie A4-Seite in meiner Anwendung repräsentieren AWT, Swing, JavaFX & SWT 6
M JavaFX Automatisches Aktualisieren der Seite AWT, Swing, JavaFX & SWT 26
S GUI Schließen Button auf der linken Seite AWT, Swing, JavaFX & SWT 2
W JavaFX Webview warten bis Seite geladen geladen ? AWT, Swing, JavaFX & SWT 0
J JavaFX Tabelle soll ganze Seite ausfüllen AWT, Swing, JavaFX & SWT 2
B Swing Form undecorated: Beim Bewegen geht die Maus immer automatisch zur linken Seite. AWT, Swing, JavaFX & SWT 7
M SWT Browser nur eine Seite erlauben AWT, Swing, JavaFX & SWT 3
P Dynamische Seite zum basteln für den User AWT, Swing, JavaFX & SWT 8
P Swing In JTable Header auch an der linken Seite AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben