java - 如何从面板内切换 JFrame 中的 JPanel?

标签 java swing menu jframe jpanel

所以,我正在尝试为一个简单的游戏制作一个基本的功能菜单。我尝试通过创建 2 个 JPanel 来做到这一点,一个用于实际游戏,另一个用于我的菜单。

我想要做的是在我的菜单面板上有一个按钮,当按下该按钮时,将显示在父 JFrame 中的 JPanel 从菜单的菜单切换到实际游戏的 JPanel。

这是我的代码:

class Menu extends JPanel
{
   public Menu()
   {
      JButton startButton = new JButton("Start!");
      startButton.addActionListener(new Listener());
      add(startButton);
   }

   private class Listener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {     
         Container container = getParent();
         Container previous = container;
         System.out.println(getParent());
         while (container != null)
         {
            previous = container;
            container = container.getParent();
         }
         previous.setContentPane(new GamePanel());      
      }
   }
}

如您所见,我为开始按钮创建了一个监听器。在监听器内部,我使用 while 循环通过 getParent() 方法访问 JFrame。该程序正在获取 JFrame 对象,但它不允许我调用 setContentPane 方法...

有谁知道如何让它工作,或者在菜单和游戏之间来回切换的更好方法吗?

最佳答案

像这样:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CardLayoutDemo extends JFrame {

    public final String YELLOW_PAGE = "yellow page";
    public final String RED_PAGE = "red page";
    private final CardLayout cLayout;
    private final JPanel mainPane;
    boolean isRedPaneVisible;

    public CardLayoutDemo(){

        setTitle("Card Layout Demo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        mainPane = new JPanel();
        mainPane.setPreferredSize(new Dimension(250,150));
        cLayout = new CardLayout();
        mainPane.setLayout(cLayout);

        JPanel yellowPane = new JPanel();
        yellowPane.setBackground(Color.YELLOW);
        JPanel redPane = new JPanel();
        redPane.setBackground(Color.RED);

        mainPane.add(YELLOW_PAGE, yellowPane);
        mainPane.add(RED_PAGE, redPane);
        showRedPane();

        JButton button = new JButton("Switch Panes");
        button.addActionListener(e -> switchPanes() );

        setLayout(new BorderLayout());
        add(mainPane,BorderLayout.CENTER);
        add(button,BorderLayout.SOUTH);
        pack();
        setVisible(true);
    }

    void switchPanes() {
        if (isRedPaneVisible) {showYelloPane();}
        else { showRedPane();}
    }

    void showRedPane() {
        cLayout.show(mainPane, RED_PAGE);
        isRedPaneVisible = true;
    }

    void showYelloPane() {
        cLayout.show(mainPane, YELLOW_PAGE);
        isRedPaneVisible = false;
    }

    public static void main(String[] args) {
        new CardLayoutDemo();
    }
}

enter image description here

关于java - 如何从面板内切换 JFrame 中的 JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870004/

相关文章:

python - 如何在菜单项中显示图标?

java - 我们不能从静态方法访问非静态实例,但可以启动一个类。如何?

java - Gradle Groovy 语法 "configurations {all*.exclude ...}"

java - 实现自定义组合框模型未能覆盖某些方法

html - 为什么这个 ul 超过了它的 div 的大小?

c++ - 如何创建 SDL 弹出菜单?

java - Java Sockets 默认实现什么 ARQ 协议(protocol)?

Eclipse 不再找到已安装的 JRE

java - 当从文本字段单击输入时,执行与按钮执行的操作相同的代码

java - BasicButtonUI 按钮不会重绘