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

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())

所以我正在建立一个挥杆游戏。我的主要游戏是在一个名为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");
}
}
我的问题是,一旦我初始化了棋盘,棋盘面板的构造器就会启动运行游戏的线程,所以当我切换到游戏时,游戏已经开始运行了。只有当我切换到第二个面板时,才有办法开始游戏

现在,这是电路板的构造器:

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;
}