如何在使用CardLayout切换后启动JPanel

时间:2013-08-30 01:58:14

标签: java swing jpanel java-2d cardlayout

所以我正在用Swing构建游戏。我的主要游戏是在一个名为Board的JPanel中,而起始屏幕是一个名为StartScreen的JPanel,我还制作了一个名为MainPanel的JPanel,其中有一个CardLayout布局,用于在两个面板之间切换。

mainPanel中:

public class MainPanel extends JPanel {

JPanel startMenu, board;

public MainPanel(){

    setLayout(new CardLayout());
    startMenu = new StartMenu(this);
    board = new Board();
    add(startMenu, "startMenu");
    add(board, "board");
}
}

我的问题是,一旦我初始化棋盘,棋盘面板的构造者正在装箱并启动一个将运行游戏的线程,所以当我切换到游戏时,游戏已经开始运行。有没有办法在我切换到第二个面板时启动游戏。

现在这是Board的构造函数:

public Board(){
    addKeyListener(new KeyBoard());
    snake = new Snake();
    apple = new Apple();
    thread = new Thread(Board.this);
    thread.start();
}

2 个答案:

答案 0 :(得分:4)

这些建议可能看似简单,但您可能需要的是简单化:

  • 不要在构造函数中启动游戏线程。
  • 当你换到游戏面板时,在那里开始你的线程。
  • 此外,您确实应该避免将KeyListeners与Swing应用程序一起使用,因为它被认为是一个非常低级的侦听器。如果适用,最好使用密钥绑定。

如,

public void swapToBoard() {
   cardLayout.show(mainContainer, "board");
   new Thread(boardInstance).start;
}

修改
你说:

  

是的,但我会在构造函数之外启动线程,当我切换JPanel时,我只是让面板可见。我正在考虑实现一个在面板变得可见时调用的侦听器。

这就是我认为CardLayout的一个问题 - 我知道这个事件没有这样的监听器,如果你看看它的API,你就会看不到这样的监听器。您可能需要将其硬编码到交换方法中。

答案 1 :(得分:3)

  

我正在考虑实现一个在面板变得可见时调用的侦听器。

您可以使用ComponentListener并收听componentShown,也可以使用AncestorListener并收听ancestorAdded