所以我正在用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();
}
答案 0 :(得分:4)
这些建议可能看似简单,但您可能需要的是简单化:
如,
public void swapToBoard() {
cardLayout.show(mainContainer, "board");
new Thread(boardInstance).start;
}
修改强>
你说:
是的,但我会在构造函数之外启动线程,当我切换JPanel时,我只是让面板可见。我正在考虑实现一个在面板变得可见时调用的侦听器。
这就是我认为CardLayout的一个问题 - 我知道这个事件没有这样的监听器,如果你看看它的API,你就会看不到这样的监听器。您可能需要将其硬编码到交换方法中。
答案 1 :(得分:3)
我正在考虑实现一个在面板变得可见时调用的侦听器。
您可以使用ComponentListener
并收听componentShown
,也可以使用AncestorListener
并收听ancestorAdded
。