加载JFrame后,是否可以将新的JPanel添加到JFrame?

时间:2017-10-17 11:53:10

标签: java swing

我正在用Java构建一个扫雷游戏。在GUI设计期间,我遇到了一个问题。这是我的游戏窗口。enter image description here

灰色区域应该包含实际的矿场。我想要发生的是,在玩家点击Start Game之后,我想加载包含mine字段实现的JPanel。但是,似乎在JFrame加载后我无法添加更多JPanel,我是否正确?我尝试在另一个线程中运行添加了mine字段(睡眠几秒然后添加JPanel),只是为了看它是否可能,并且没有结果。

public GameWindow(){

        super("Minesweeper");
        this.setLayout(new BorderLayout());

        this.gamePanel = new GamePanel(new GridLayout(BOARD_SIZE,BOARD_SIZE,1,1));

        this.timerPanel = new TimerPanel(new BorderLayout(15,15));

        this.timerPanel.initializeFlagLabel(8);

        this.mineField = new Button[BOARD_SIZE][BOARD_SIZE];
        int buttonCounter = 0;

        for(int i = 0; i < BOARD_SIZE; i ++){

            for(int j = 0; j < BOARD_SIZE; j++){

                mineField[i][j] = new Button();
                mineField[i][j].setName(Integer.toString(buttonCounter++));
                mineField[i][j].setBackground(Color.GRAY);
                mineField[i][j].setPreferredSize(new Dimension(10,10));
                mineField[i][j].addMouseListener(this);
                gamePanel.add(mineField[i][j]);
            }
        }
        Container container = getContentPane();

        container.add(timerPanel,BorderLayout.PAGE_START);

        container.add(new MenuPanel(this), BorderLayout.WEST);

        new Thread(new Runnable(){//Here I want to wait for the JFrame to 
                                  //load and then to add the gamePanel.
                 public void run(){
                     try {
                        Thread.sleep(4000);
                        container.add(gamePanel, BorderLayout.CENTER);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                    e.printStackTrace();
                }

             }
        }); 

        this.setSize(800,640);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setVisible(true);

    }

总结一下我的问题是,是否可以在运行时向JFrame添加新的JPanel,如果可以,我该怎么办呢?

2 个答案:

答案 0 :(得分:2)

简短的回答是,是的。您需要调用$ ogg123 -d wav file.ogg -f out.wav Audio Device: WAV file output Playing: file.ogg Ogg Vorbis stream: 1 channel, 22050 Hz Done. revalidate来触发已更新容器的布局和绘制传递。

答案越长,可能不是你这样做的方式。

除了你实际上repaint start之外,Swing不是线程安全的,你不应该更新事件调度线程上下文的UI。

在您的情况下,替代(和更安全)的解决方案是使用Swing Thread。有关详细信息,请参阅How to use Swing Timers

答案 1 :(得分:1)

在开始游戏的动作侦听器中,您可以将jpanel添加到预先创建的帧中。您还可能需要repaint()revalidate()