GUI, das verschiedene Panels hat (Von Seite zu Seite navigieren)

internet

Top Contributor
Hallo,

ich versuche mich gerade in Swing und nutze hier auch den Windows Builder.
Ich habe folgendes Video gefunden und möchte das auch so nachstellen:

Prinzipiell möchte ich einfach ein kleines Programm haben, bei dem ich ein Menü habe. Und je nachdem auf welchen Menüpunkt ich klicke, soll der Hauptscreen angepasst werden. Also Menüitem clicken -> andere Seite in dem Content Bereich anzeigen.

Leider funktioniert aber der Klick auf das Menü Item nicht, sodass die Seite sich wechselt.
Was mache ich falsch?

Hier mein Code:

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLayeredPane;
import java.awt.CardLayout;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JButton;

public class Test extends JFrame {

    private JPanel contentPane;
    private JLayeredPane layeredPane;
    private JPanel panel1;
    private JPanel panel2;

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

    /**
     * Create the frame.
     */
    public Test() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        
        JMenu mnNewMenu = new JMenu("Generel");
        menuBar.add(mnNewMenu);
        
        JMenuItem mntmNewMenuItem = new JMenuItem("Startseite");
        mntmNewMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPanel(panel1);
            }
        });
        mnNewMenu.add(mntmNewMenuItem);
        
        JMenuItem mntmNewMenuItem_1 = new JMenuItem("Einstellung");
        mntmNewMenuItem_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPanel(panel2);
            }
        });
        mnNewMenu.add(mntmNewMenuItem_1);
        
        JMenu mnNewMenu_1 = new JMenu("Sonstiges");
        menuBar.add(mnNewMenu_1);
        
        JMenuItem mntmNewMenuItem_2 = new JMenuItem("Version");
        mnNewMenu_1.add(mntmNewMenuItem_2);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        layeredPane = new JLayeredPane();
        layeredPane.setBounds(5, 5, 440, 246);
        contentPane.add(layeredPane);
        layeredPane.setLayout(new CardLayout(0, 0));
        
        panel1 = new JPanel();
        layeredPane.add(panel1, "name_180517695084643");
        panel1.setLayout(null);
        
        JLabel lblNewLabel = new JLabel("Panel1");
        lblNewLabel.setBounds(47, 6, 164, 62);
        panel1.add(lblNewLabel);
        
        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPanel(panel2);
            }
        });
        btnNewButton.setBounds(57, 68, 117, 29);
        panel1.add(btnNewButton);
        
        panel2 = new JPanel();
        layeredPane.add(panel2, "name_180517708202294");
        panel2.setLayout(null);
        
        JLabel lblNewLabel_1 = new JLabel("New label");
        lblNewLabel_1.setBounds(182, 105, 61, 16);
        panel2.add(lblNewLabel_1);
    }
    
    
    public void switchPanel(JPanel panel) {
        layeredPane.removeAll();
        layeredPane.add(panel);
        layeredPane.repaint();
        layeredPane.revalidate();
    }
}

Kann hier jemand helfen?
 
Funktioniert fuer mich. Sowohl "Generel/Startseite" als auch "Generel/Einstellung" wechselt. "Sonstiges/Version" natuerlich nicht, da ist aber auch kein Handler definiert.
 
Nur die Klasse kopiert und direkt ausgeführt.

Was für ein Fehlverhalten hast Du denn bei Dir? Sicher, dass es komplett und richtig übersetzt wurde und Du keine alte Version startest? Welche Java Version nutzt du?
 
wenn ich es so laufen lasse in Eclipse, bekomme ich kein Fenster angezeigt:
1634892893108.png

Starte ich es so, dann kommt das Fenster, aber der Switch funktioniert nicht.
1634892931095.png

Ich verwende die Version Java 1.8
 
Also auch mit Java 1.8 funktioniert es einwandfrei.

Du solltest mal sicher stellen, dass der Code komplett übersetzt wurde. Also Project -> Clean ... ausführen und dann noch einmal alles Bauen lassen und ausführen.

Dabei auch einmal schauen: Ist das Project -> Build Automatically noch immer aktiv?

Und im Package Explorer sicher stellen, dass Du nicht mehrere Dinge hast und evtl. etwas falsches startest.

Und ansonsten noch den Hinweis zu Lambda Expressions / Method References. Dieses new SomeInterface { .. } ist einfach extrem unleserlich und bläht den Code unnötig auf. Evtl. macht es Sinn, statt Eclipse eine IDE wir IntelliJ zu nutzen - da bekommst Du sowas als Hinweis und ein Alt-Enter stellt es Dir automatisch um (Was evtl. auch bei Eclipse geht ... Aber ich finde Eclipse für Anfänger eher ungeeignet.)

Der angepasste Code wäre dann z.B.:
Java:
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;

public class Test extends JFrame {

    private JPanel contentPane;
    private JLayeredPane layeredPane;
    private JPanel panel1;
    private JPanel panel2;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(Test::createAndShowMainWindow);
    }

    public static void createAndShowMainWindow() {
        try {
            Test frame = new Test();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the frame.
     */
    public Test() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu mnNewMenu = new JMenu("Generel");
        menuBar.add(mnNewMenu);

        JMenuItem mntmNewMenuItem = new JMenuItem("Startseite");
        mntmNewMenuItem.addActionListener(e -> switchPanel(panel1));
        mnNewMenu.add(mntmNewMenuItem);

        JMenuItem mntmNewMenuItem_1 = new JMenuItem("Einstellung");
        mntmNewMenuItem_1.addActionListener(e -> switchPanel(panel2));
        mnNewMenu.add(mntmNewMenuItem_1);

        JMenu mnNewMenu_1 = new JMenu("Sonstiges");
        menuBar.add(mnNewMenu_1);

        JMenuItem mntmNewMenuItem_2 = new JMenuItem("Version");
        mnNewMenu_1.add(mntmNewMenuItem_2);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        layeredPane = new JLayeredPane();
        layeredPane.setBounds(5, 5, 440, 246);
        contentPane.add(layeredPane);
        layeredPane.setLayout(new CardLayout(0, 0));

        panel1 = new JPanel();
        layeredPane.add(panel1, "name_180517695084643");
        panel1.setLayout(null);

        JLabel lblNewLabel = new JLabel("Panel1");
        lblNewLabel.setBounds(47, 6, 164, 62);
        panel1.add(lblNewLabel);

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(e -> switchPanel(panel2));
        btnNewButton.setBounds(57, 68, 117, 29);
        panel1.add(btnNewButton);

        panel2 = new JPanel();
        layeredPane.add(panel2, "name_180517708202294");
        panel2.setLayout(null);

        JLabel lblNewLabel_1 = new JLabel("New label");
        lblNewLabel_1.setBounds(182, 105, 61, 16);
        panel2.add(lblNewLabel_1);
    }


    public void switchPanel(JPanel panel) {
        layeredPane.removeAll();
        layeredPane.add(panel);
        layeredPane.repaint();
        layeredPane.revalidate();
    }
}
 
Warum werden in switchPanel Komponenten entfernt und hinzugefügt? Das CardLayout sollte das ein- und ausblenden doch per String-Key übernehmen, wozu wär's denn sonst da.
 
Hier ein Beispiel mit dem CardLayout. Als Basis hab ich aus Gewohnheit ein Gridbaglayout verwendet, geht natürlich auch mit jedem anderen. Außerdem hab ich mein Zeugs gerne in einem Panel und nicht in einem Frame. Anstatt Menus gibt' Togglebuttons. Macht der Gewohnheit.

[CODE lang="java" title="CadrLayout Beispiel"]import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

public class CardTest extends javax.swing.JPanel {

/**
* Creates new form CardTest
*/
public CardTest() {
CardTest.this.setLayout(new java.awt.GridBagLayout());

JToggleButton jtPage0 = new JToggleButton("Seite 1");
jtPage0.setActionCommand("page0");
GridBagConstraints gbc0 = new GridBagConstraints();
gbc0.weightx = 0.5;
CardTest.this.add(jtPage0, gbc0);

JToggleButton jtPage1 = new JToggleButton("Seite 2");
jtPage1.setActionCommand("page1");
GridBagConstraints gbc1 = new GridBagConstraints();
gbc1.weightx = 0.5;
CardTest.this.add(jtPage1, gbc1);

JPanel jpCards = 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;
CardTest.this.add(jpCards, gbcCards);

JPanel jpCard0 = new JPanel(new FlowLayout());
jpCard0.add(new JLabel("Seite 1"));
jpCards.add(jpCard0, "page0");
JPanel jpCard1 = new JPanel(new FlowLayout());
jpCard1.add(new JLabel("Seite 2"));
jpCards.add(jpCard1, "page1");


ItemListener buttonSelectListener = (ItemEvent e) -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
showCard(((AbstractButton) e.getSource()).getActionCommand(), jpCards);
}
};
jtPage0.addItemListener(buttonSelectListener);
jtPage1.addItemListener(buttonSelectListener);

ButtonGroup grp = new ButtonGroup(); //nur einer der Buttons soll auswählbar sein.
grp.add(jtPage0);
grp.add(jtPage1);
jtPage0.setSelected(true); //jetzt noch die Startseite - oder welche auch immer - auswählen
}

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

public static void main(String[] args) {
JFrame testFr = new JFrame("Title");
testFr.setContentPane(new CardTest());
testFr.setSize(800, 600);
testFr.setLocationRelativeTo(null);
testFr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
EventQueue.invokeLater(() -> testFr.setVisible(true));
}
}
[/CODE]
 

Zurück
Oben