如何让一个JPanel显示,而另一个在点击按钮时消失?

2022-04-17 00:00:00 class java swing actionlistener

我有3个不同的类,Main Menu类上的设置按钮应该切换到Main Menu,但它只是隐藏了第一个面板,当我在另一个菜单上单击Return时也是一样,我想找到一个简单的解决方案而不使用布局管理器,因为我不知道如何让卡片布局与这两个类通信,但这就是解决方案,如果有人能给我一些如何实现的指示就太好了:

我想让另一个JPanel在单击按钮时显示出来,但它不起作用,第一个只是消失了。我如何修复此问题?

非常感谢!


解决方案

这听起来像是CardLayout的用例。您有一个名为cards的JPanel,它使用CardLayout管理器。您可以将所有面板(卡片)添加到该面板,为它们指定唯一的名称(例如,";Main_Menu";、";设置";等)。然后,您只需传递卡片面板,而不是传递每个面板中的其他面板,该面板可用于显示您希望显示的卡片,例如,在单击按钮时cl.show(cards, "SETTINGS");

更新

根据@c0der的建议(请参阅下面的注释部分),代码结构已更新。

Game.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Game extends JFrame {
    JPanel cards;
    CardLayout cardLayout;
    
    public Game(){
        MainMenu mainMenu = new MainMenu();
        Settings settings = new Settings();
        cardLayout = new CardLayout();
        cards = new JPanel(cardLayout);
        cards.add(mainMenu, "MAIN_MENU");
        cards.add(settings, "SETTINGS");
        mainMenu.setSetBtnActionListener(new BtnController("SETTINGS"));
        settings.setReturnBtnActionListener(new BtnController("MAIN_MENU"));
        add(cards);
        setSize(640,480);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    class BtnController implements ActionListener {
        String cardName;
        public BtnController(String cardName) {
            this.cardName = cardName;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            cardLayout.show(cards, cardName);
        }
    }
    
    public static void main(String[] args) {
        new Game();
    }
}

MainMenU.S.Java

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;

public class MainMenu extends JPanel {
    JButton setBtn;
    
    public MainMenu() {
        setLayout(new GridLayout(1, 3));
        JButton newGameBtn = new JButton("New Game");
        JButton contBtn = new JButton("Continue");
        setBtn = new JButton("Settings");
        add(newGameBtn);
        add(contBtn);
        add(setBtn);
    }

    public void setSetBtnActionListener(ActionListener al) {
        setBtn.addActionListener(al);
    }
}

Settings.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;

public class Settings extends JPanel {
    JButton returnBtn;
    
    public Settings() {
        returnBtn = new JButton("Return");
        setLayout(new BorderLayout());
        add(returnBtn, BorderLayout.SOUTH);
    }

    public void setReturnBtnActionListener(ActionListener al) {
        returnBtn.addActionListener(al);
    }
}

相关文章