Swing:当点击第一个JPanel时,启动第二个JPanel

时间:2013-07-09 18:05:58

标签: java swing jframe jpanel

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

我的不同布局在不同的JPanels中(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 个答案:

答案 0 :(得分:4)

正如@nachokk所说,你应该使用CardLayout代替。它允许您在浏览器中执行选项卡等操作,但如果您不想,则无需为您的游戏显示选项卡。您首先会看到欢迎“卡片”,然后当用户点击时您切换到Board“卡片”。

enter image description here

答案 1 :(得分: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);

这是一个教程How to use CardLayout

答案 2 :(得分:2)

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

这样的动作
    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();
            }
   });

答案 3 :(得分:1)

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

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

编辑:根据您的目的,CardLayout可能是您想要用于Frame的布局。