JPanels innerhalb eines JFrame wechseln
Frage:
Ich bin neu bei Java-Komponenten und habe Probleme JPanels innerhalb eines JFrames wechseln. Wenn ich gameOn() aufrufe, wird die Frame-Oberfläche leer, ohne dass das Spielfeld angezeigt wird. Wie kann ich das beheben?
Antwort:
Anstatt Komponenten hinzuzufügen und zu entfernen, wird empfohlen, ein CardLayout zu verwenden. So geht's:
Erstellen Sie ein CardLayout-Objekt und ein JPanel damit:
<code class="java">CardLayout cardLayout = new CardLayout(); JPanel mainPanel = new JPanel(cardLayout);</code>
Fügen Sie die Menü- und Spielfelder zum MainPanel hinzu:
<code class="java">MenuPanel menu = new MenuPanel(); GamePanel game = new GamePanel(); mainPanel.add(menu, "menu"); mainPanel.add(game, "game");</code>
In der gameOn()-Methode einfach das Spielfeld mit cardLayout anzeigen, ohne Komponenten hinzuzufügen oder zu entfernen:
<code class="java">public void gameOn() { cardLayout.show(mainPanel, "game"); }</code>
Beispiel:
<code class="java">import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; class GameFrame extends JFrame implements ActionListener { public static void main(String[] args) { SwingUtilities.invokeLater(() -> new GameFrame().setVisible(true)); } private CardLayout cardLayout; private JPanel mainPanel; private MenuPanel menuPanel; private GamePanel gamePanel; public GameFrame() { cardLayout = new CardLayout(); mainPanel = new JPanel(cardLayout); menuPanel = new MenuPanel(); mainPanel.add(menuPanel, "menu"); gamePanel = new GamePanel(); mainPanel.add(gamePanel, "game"); JButton goGameButton = new JButton("Go to Game"); goGameButton.addActionListener(this); add(mainPanel); add(goGameButton, BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } @Override public void actionPerformed(ActionEvent e) { cardLayout.show(mainPanel, "game"); } } class MenuPanel extends JPanel { public MenuPanel() { setBackground(Color.GREEN); add(new JLabel("Menu")); } @Override public Dimension getPreferredSize() { return new Dimension(300, 300); } } class GamePanel extends JPanel { public GamePanel() { setBackground(Color.BLUE); add(new JLabel("Game")); } @Override public Dimension getPreferredSize() { return new Dimension(300, 300); } }</code>
Das obige ist der detaillierte Inhalt vonWie wechsle ich JPanels innerhalb eines JFrames mit CardLayout?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!