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?
 

Robert Zenz

Top Contributor
Funktioniert fuer mich. Sowohl "Generel/Startseite" als auch "Generel/Einstellung" wechselt. "Sonstiges/Version" natuerlich nicht, da ist aber auch kein Handler definiert.
 
K

kneitzel

Gast
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?
 

internet

Top Contributor
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
 
K

kneitzel

Gast
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();
    }
}
 

Neumi5694

Top Contributor
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.
 

Neumi5694

Top Contributor
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]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
E verschiedene Cursor setzen AWT, Swing, JavaFX & SWT 1
RedEagle JavaFX Verschiedene Bereiche miteinander verknüpfen AWT, Swing, JavaFX & SWT 7
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
E wie fängt man verschiedene Ereignisse ein mit MVC ? AWT, Swing, JavaFX & SWT 42
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
V Swing Nimbus Look And Feel verschiedene Buttons AWT, Swing, JavaFX & SWT 8
W Verschiedene Foreground color in Combo SWT Auswahlliste AWT, Swing, JavaFX & SWT 5
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
M 3D-Grafik verschiedene Texturen auf einen Würfel mappen AWT, Swing, JavaFX & SWT 15
T Swing verschiedene Auflösungen AWT, Swing, JavaFX & SWT 7
J 3D-Grafik JOGL - Verschiedene Perspektiven darstellen AWT, Swing, JavaFX & SWT 5
R JTree - verschiedene Verzeichnisse AWT, Swing, JavaFX & SWT 3
T AWT verschiedene Oberflächen programmieren AWT, Swing, JavaFX & SWT 5
D verschiedene Zeichenebenen AWT, Swing, JavaFX & SWT 10
M Verschiedene Layouts anzeigen AWT, Swing, JavaFX & SWT 5
Dit_ Verschiedene Icons in einer JTable-Zelle AWT, Swing, JavaFX & SWT 2
H Swing TableCellRenderer für verschiedene Spalten AWT, Swing, JavaFX & SWT 11
N Verschiedene FormLayout in einem Panelbuilder AWT, Swing, JavaFX & SWT 3
D Verschiedene ActionEvents für ein JButton-Array AWT, Swing, JavaFX & SWT 2
M Swing Swing, MVC über verschiedene Panel AWT, Swing, JavaFX & SWT 4
P verschiedene JPanels einblenden je nach auswahl AWT, Swing, JavaFX & SWT 2
K Verschiedene ComboBoxen in JTable AWT, Swing, JavaFX & SWT 9
D 2 verschiedene Frames mit einem Button schliessen AWT, Swing, JavaFX & SWT 2
D Mit der Maus in verschiedene Modi wechseln AWT, Swing, JavaFX & SWT 15
I JTable: "GLEICHZEITIG" zwei verschiedene TableMode AWT, Swing, JavaFX & SWT 2
F GridLayout: verschiedene Spaltenbreiten AWT, Swing, JavaFX & SWT 2
S verschiedene Menuleisten AWT, Swing, JavaFX & SWT 2
S In einem button Panel 2 verschiedene TiteledBoarder erzeugen AWT, Swing, JavaFX & SWT 5
T verschiedene Farben in einem Text/Editfeld AWT, Swing, JavaFX & SWT 11
R Fenster in verschiedene Bereiche teilen - aber wie? AWT, Swing, JavaFX & SWT 4
D Mehrere verschiedene Textfelder auslesen? AWT, Swing, JavaFX & SWT 10
Icewind Verschiedene Farben in einer JTextArea AWT, Swing, JavaFX & SWT 3
F Verschiedene Vordergrundfarben in einer TextArea AWT, Swing, JavaFX & SWT 4
G JFileChooser in verschiedene Sprachen? AWT, Swing, JavaFX & SWT 6
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
G LayoutManager Panels anordnen über Schleifenvariablen AWT, Swing, JavaFX & SWT 7
B Bounds aller Panels aktualisieren AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L Swing Panels bewegen wie Windows 10 Kacheln AWT, Swing, JavaFX & SWT 0
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
T Swing Bug: mehrfache Panels bei Mouseover? AWT, Swing, JavaFX & SWT 11
P Zwischen verschiedenen Panels wechseln AWT, Swing, JavaFX & SWT 3
F abgeleitete Panels von einem ContentPanel AWT, Swing, JavaFX & SWT 4
K Event Handling Über JMenuBar die diversen Panels anzeigen AWT, Swing, JavaFX & SWT 10
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
R Swing panels nebeneinander mit BoxLayout.X_AXIS AWT, Swing, JavaFX & SWT 4
P Swing Panels Wechseln AWT, Swing, JavaFX & SWT 9
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
V AWT Panels überlappen AWT, Swing, JavaFX & SWT 1
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
U Swing Panels im Contentpane durchschalten AWT, Swing, JavaFX & SWT 1
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
S Swing Plätze von 2 panels vertauschen AWT, Swing, JavaFX & SWT 4
T Panels mit Button verbinden AWT, Swing, JavaFX & SWT 3
F Swing Wie verwalte ich meine Panels richtig? AWT, Swing, JavaFX & SWT 2
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
D Stapelung von Panels AWT, Swing, JavaFX & SWT 6
V Swing MouseEvents bei gestapelten Panels AWT, Swing, JavaFX & SWT 2
B JApplet zwei Panels autobreite? AWT, Swing, JavaFX & SWT 2
kodela Teil eines Panels als Graphik speichern AWT, Swing, JavaFX & SWT 3
Kenan89 LayoutManager MigLayout Positionierung von Panels AWT, Swing, JavaFX & SWT 4
A Panels in JavaFX zur Laufzeit erzeugen AWT, Swing, JavaFX & SWT 5
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
F Panels über buttons zu anderen Panels hinzufügen AWT, Swing, JavaFX & SWT 2
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
J Problem mit der Höhe eines Panels AWT, Swing, JavaFX & SWT 11
M Swing JTabbedPane Panels deaktivieren AWT, Swing, JavaFX & SWT 2
S Swing (Nicht) Vergrößern von Panels AWT, Swing, JavaFX & SWT 3
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
B LayoutManager Zeilenweise Anordnung von Panels AWT, Swing, JavaFX & SWT 19
B Panels wechseln auf Knopfdruck AWT, Swing, JavaFX & SWT 17
N Hilfe bei Panels! AWT, Swing, JavaFX & SWT 11
J LayoutManager Panels übereinander AWT, Swing, JavaFX & SWT 3
P Von einem Panel auf die Objekte des anderen Panels zugreifen AWT, Swing, JavaFX & SWT 3
C Aufklappbare Panels AWT, Swing, JavaFX & SWT 2
D Panels Dynamisch zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 2
D Vererbung von Panels AWT, Swing, JavaFX & SWT 8
E Wie Breite und Höhe eines Panels festlegen? AWT, Swing, JavaFX & SWT 5
B Panels stapeln, geht das? AWT, Swing, JavaFX & SWT 7
I 2 Panels übereinander, 1 transparent AWT, Swing, JavaFX & SWT 2
S GridBagLayout Panels AWT, Swing, JavaFX & SWT 2
W Panels vertikal anordnen AWT, Swing, JavaFX & SWT 10
R Swing Kommunikation zwischen Panels AWT, Swing, JavaFX & SWT 2
F Abschaltbare Panels AWT, Swing, JavaFX & SWT 5
aze Layout auf Teil eines Panels anwenden AWT, Swing, JavaFX & SWT 5
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
I Swing Positionieren von Panels mit layoutManager AWT, Swing, JavaFX & SWT 6
B Java Grafiken an bestimmter Positon des Panels anzeigen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben