Java 使用CardLayout切换后如何启动JPanel
所以我正在建立一个挥杆游戏。我的主要游戏是在一个名为Board的JPanel中,而开始屏幕是一个名为StartScreen的JPanel,我还制作了一个名为MainPanel的JPanel,带有一个CardLayout布局,我使用它在两个面板之间切换 主面板:Java 使用CardLayout切换后如何启动JPanel,java,swing,jpanel,java-2d,cardlayout,Java,Swing,Jpanel,Java 2d,Cardlayout,所以我正在建立一个挥杆游戏。我的主要游戏是在一个名为Board的JPanel中,而开始屏幕是一个名为StartScreen的JPanel,我还制作了一个名为MainPanel的JPanel,带有一个CardLayout布局,我使用它在两个面板之间切换 主面板: public class MainPanel extends JPanel { JPanel startMenu, board; public MainPanel(){ setLayout(new 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");
}
}
我的问题是,一旦我初始化了棋盘,棋盘面板的构造器就会启动运行游戏的线程,所以当我切换到游戏时,游戏已经开始运行了。只有当我切换到第二个面板时,才有办法开始游戏
现在,这是电路板的构造器:
public Board(){
addKeyListener(new KeyBoard());
snake = new Snake();
apple = new Apple();
thread = new Thread(Board.this);
thread.start();
}
这些建议似乎过于简单,但您可能需要的是过于简单的建议: 不要在构造函数中启动游戏线程。 当你切换到游戏面板时,在那里开始你的线程。 此外,您确实应该避免在Swing应用程序中使用KeyListener,因为它被认为是非常低级的侦听器。如果适用,最好使用键绑定。 e、 g 编辑 你说:
是的,但我会在构造函数之外启动线程,当我切换JPanel时,我只是让面板可见。我正在考虑实现一个侦听器,当面板变得可见时调用它
这就是我认为CardLayout的一个问题——我知道这个事件没有这样的监听器,如果你看看它的API,你会发现没有这样的监听器。您可能需要将其硬编码到您的交换方法中。这些建议可能看起来过于简单,但您可能需要的是过于简单: 不要在构造函数中启动游戏线程。 当你切换到游戏面板时,在那里开始你的线程。 此外,您确实应该避免在Swing应用程序中使用KeyListener,因为它被认为是非常低级的侦听器。如果适用,最好使用键绑定。 e、 g 编辑 你说:
是的,但我会在构造函数之外启动线程,当我切换JPanel时,我只是让面板可见。我正在考虑实现一个侦听器,当面板变得可见时调用它 这就是我认为CardLayout的一个问题——我知道这个事件没有这样的监听器,如果你看看它的API,你会发现没有这样的监听器。您可能需要将其硬编码到swap方法中 我正在考虑实现一个侦听器,当面板变得可见时调用它 您可以使用ComponentListener并侦听显示的组件,也可以使用AncestorListener并侦听添加的AncestorListener 我正在考虑实现一个侦听器,当面板变得可见时调用它
您可以使用ComponentListener并侦听ComponentShowed,也可以使用AncestorListener并侦听ancestorAdded。是的,但我会在构造函数之外启动线程,当我切换JPanel时,我只是让面板可见。我正在考虑实现一个侦听器,当面板可见时调用它。谢谢,是的,我通过在board中编写一个名为getThread的函数并在调用CardLayout.next后调用board.getThread.start解决了这个问题。我不确定这是否是最干净的解决方案,但它确实有效。我还考虑添加一个while循环,不断检查布尔值是否为true,并向board添加一个方法,从中我可以将布尔值设置为true。但是我担心它可能效率较低。@Danielcode10:请看一下这段小代码,您可以根据需要修改这个小示例,然后将其融入实际游戏中。我希望它有帮助:-是的,但我会在构造函数之外启动线程,当我切换JPanel时,我只是让面板可见。我正在考虑实现一个侦听器,当面板可见时调用它。谢谢,是的,我通过在board中编写一个名为getThread的函数并在调用CardLayout.next后调用board.getThread.start解决了这个问题。我不确定这是否是最干净的解决方案,但它确实有效。我还考虑添加一个while循环,不断检查布尔值是否为true,并向board添加一个方法,从中我可以将布尔值设置为true。但是我担心它可能效率较低。@Danielcode10:请看一下这段小代码,您可以根据需要修改这个小示例,然后将其融入实际游戏中。我希望这有助于:-
public void swapToBoard() {
cardLayout.show(mainContainer, "board");
new Thread(boardInstance).start;
}