1

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

主面板:

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();
}
4

2 回答 2

4

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

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

例如,

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

编辑
你状态:

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

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

于 2013-08-30T02:09:53.760 回答
3

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

您可以使用 a ComponentListenerand listen forcomponentShown或者您可以使用 an AncestorListenerand listen for ancestorAdded

于 2013-08-30T03:25:40.313 回答