0

我正在编写一个简单的 java 游戏,我正面临这个问题:

我的不同布局在不同的 JPanel 中(1 个 JPanel 用于欢迎页面,我必须按“开始游戏”,另一个具有实际功能)

我从 JFrame 开始游戏

import javax.swing.JFrame;

public class RType extends JFrame {

    public RType() {

        add(new Welcome());//first panel
        add(new Board());//panel with the game

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(100, 100);
        setResizable(false);
        setVisible(true);

    }

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

显然,这会在第一个面板之后立即启动第二个面板,而我看不到第一个面板。我尝试了一些东西,试图在main方法中调用第二个面板,当第一个面板被点击时:

RType rt=new RType();
rt.add(new Board()); //in this case add(new Board()); is removed from constructor

但它什么也没做。我该如何解决?

4

4 回答 4

4

正如@nachokk 所说,您应该改用CardLayout。它允许您在浏览器中执行选项卡之类的操作,但如果您不想让选项卡对您的游戏可见,则无需这样做。你首先让你的欢迎“卡片”可见,然后当用户点击你切换到Board“卡片”。

在此处输入图像描述

于 2013-07-09T18:08:41.433 回答
3

我不建议直接添加到 JFrame 组件中,而是使用另一个容器作为JPanel. JFrame 默认布局是BorderLayout,当您以添加方式添加时,它总是放在中心。

做这样的事情:

JFrame frame = new JFrame();
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new CardLayout());
mainPanel.add(new Welcome(), "Welcome");
mainPanel.add(new Board(),"Board");
frame.add(mainPanel);

这是一个教程如何使用 CardLayout

于 2013-07-09T18:12:17.827 回答
2

在欢迎的第一个面板上添加一个按钮,并应用 actionperformed like

    JButton myButton = new JButton("Add Component ");
    myButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            frame.remove(welcome);
            frame.add(Board, BorderLayout.CENTER);
            frame.revalidate();
            frame.repaint();
            }
   });
于 2013-07-09T18:15:13.777 回答
1

默认情况下,两个面板都将填满整个 Frame 的区域。要解决此问题,您将需要使用另一种布局,例如 GridLayout 来构建面板将占据 Frame 区域的区域。

您也可以不使用布局来硬编码您希望面板适合框架的像素值。

编辑:根据您要执行的操作, CardLayout 可能是您想要用于 Frame 布局的内容。

于 2013-07-09T18:08:14.577 回答