Home >Java >javaTutorial >The title could be: How to Switch Between JPanels in a JFrame Using CardLayout?

The title could be: How to Switch Between JPanels in a JFrame Using CardLayout?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 11:30:27760browse

The title could be: How to Switch Between JPanels in a JFrame Using CardLayout?

How Can I Transition Between JPanels within a JFrame?

Initial Question:

A beginner in Java components seeks assistance in switching between MenuPanel and GamePanel within a JFrame. The current code only creates a blank JFrame upon calling gameOn(), rather than initiating the game. Suggestions are welcomed to resolve this issue, taking into account the presence of a mouse listener in MenuPanel.

Solution:

Instead of employing the approach of removing and adding components, it is advisable to utilize a CardLayout. This allows for the seamless transition between panels without the need for repeated addition and removal.

Code Implementation:

<code class="java">CardLayout cardLayout = new CardLayout();
JPanel mainPanel = new JPanel(cardLayout);

MenuPanel menu = new MenuPanel();
GamePanel game = new GamePanel();
mainPanel.add(menu, "menu");
mainPanel.add(game, "game");

...
public void gameOn() {
    cardLayout.show(mainPanel, "game");
}</code>

Explanation:

  • When gameOn() is invoked, the MenuPanel will be pushed to the back and rendered as hidden, while the GamePanel will be brought to the front and displayed.

Example:

For a practical demonstration, consider the following code:

<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;

public class GameFrame extends JFrame implements ActionListener{

    CardLayout cardLayout;
    JPanel mainPanel;
    MenuPanel menu;
    GamePanel game;

    public GameFrame() {
        cardLayout = new CardLayout();
        mainPanel = new JPanel(cardLayout);
        menu = new MenuPanel();
        game = new GamePanel();
        mainPanel.add(menu, "menu");
        mainPanel.add(game, "game");


        JButton goGame = new JButton("Go TO Game");
        goGame.addActionListener(this);

        add(mainPanel);
        add(goGame, BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationByPlatform(true);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        gameOn();
    }

    public void gameOn() {
        cardLayout.show(mainPanel, "game");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                GameFrame gameFrame = new GameFrame();
            }
        });
    }
}

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>

This implementation showcases the use of CardLayout to smoothly transition between the MenuPanel and GamePanel within a JFrame.

The above is the detailed content of The title could be: How to Switch Between JPanels in a JFrame Using CardLayout?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn