Java 从一个JPanel切换到另一个JPanel,然后再切换回来

Java 从一个JPanel切换到另一个JPanel,然后再切换回来,java,swing,jpanel,cardlayout,Java,Swing,Jpanel,Cardlayout,多亏@camickr才得以解决 我用JFrame和JPanels构建了一个游戏。游戏一切正常,但我想在两个关卡之间添加一个屏幕,让用户知道他们已经完成了当前关卡,下一个关卡正在加载。 代码应该切换到一个JPanel,等待一秒钟,然后再次切换回加载了新级别的原始区域。我正在使用CardLayout在屏幕之间交换,并尝试使用swing计时器和Thread.sleep()等待,但当我运行代码时,级别之间的JPanel永远不会显示。我认为编译器正在运行该方法中的所有代码,并认为应该在原始JPanel上结

多亏@camickr才得以解决

我用JFrame和JPanels构建了一个游戏。游戏一切正常,但我想在两个关卡之间添加一个屏幕,让用户知道他们已经完成了当前关卡,下一个关卡正在加载。 代码应该切换到一个JPanel,等待一秒钟,然后再次切换回加载了新级别的原始区域。我正在使用CardLayout在屏幕之间交换,并尝试使用swing计时器和Thread.sleep()等待,但当我运行代码时,级别之间的JPanel永远不会显示。我认为编译器正在运行该方法中的所有代码,并认为应该在原始JPanel上结束,因此永远不会显示完整的JPanel级别

我在下面创建了一个MVCE,突出了这个问题:

package testjpanelexample;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class TestJPanelExample {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) 
{
    // TODO code application logic here
    TestJPanelExample test = new TestJPanelExample("Test");
}
private final int FRAME_WIDTH = 500;
private final int FRAME_HEIGHT = 500;
private final JFrame gameWindow;
private final TestDrawingPanel myDrawingPanel;
private final TestStartGame startGame;
private final JPanel cards;
private final CardLayout cl1;
private static final String DRAWINGPANEL = "DrawingPanel";
private static final String STARTGAME = "StartGame";

//creates a JFrame and all the JPanels and adds them to a CardLayout
public TestJPanelExample(String title)
{               
    gameWindow = new JFrame(title);
    gameWindow.setSize(FRAME_WIDTH, FRAME_HEIGHT);
    cards = new JPanel(new CardLayout());
    startGame = new TestStartGame(FRAME_WIDTH, FRAME_HEIGHT);
    startGame.addAL(new StartButton());
    myDrawingPanel = new TestDrawingPane(FRAME_WIDTH, FRAME_HEIGHT);
    gameWindow.add(cards);
    cards.add(startGame, STARTGAME);
    cards.add(myDrawingPanel, DRAWINGPANEL);
    cl1 = (CardLayout)(cards.getLayout());
    gameWindow.setVisible(true);
    gameWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}


//starts the game running
public void startTheGame()
{
    cl1.show(cards, DRAWINGPANEL);
    update();
}

//switches back to the start screen    
public void update()
{
    cl1.show(cards, STARTGAME);
}    

//an action listener to be added to the start screen
private class StartButton implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {           
            startTheGame();
    }
}


//The opening screen
class TestStartGame extends JPanel 
{

private JPanel buttons;
public  JButton start;

//creates a JPanel with a single button to start the game    
public TestStartGame(int width, int height)
{
    setSize(width, height);
    setBackground(Color.GREEN);
    start = new JButton("Start");
    add(start);
}            

//adds an action listener to the button    
public void addAL(ActionListener al)
{
    start.addActionListener(al);
}   
}

//The game screen (currently just a blank blue screen)
class TestDrawingPanel extends JPanel{

//creates the drawing panel 
public TestDrawingPanel(int width, int height)
{                
    setSize(width, height);
    this.setBackground(Color.CYAN);
}      
} 
}

如果未调用更新方法,则myDrawingPanel将显示为一个空白的青色屏幕。但是如果调用了update方法,那么屏幕就停留在start屏幕上。非常感谢您的帮助。

代码应切换到一个JPanel,等待一秒钟,然后在加载新级别后再次切换回原始区域。
-然后您需要使用
摆动计时器。不要使用Thread.sleep()。您的
MCVE
没有显示计时器逻辑,因此我们无法猜测您可能做错了什么。基本上是切换到临时面板的逻辑。然后你启动计时器。当计时器启动时,您切换回游戏面板。完美。我试着用一个定时器来做两件事,但需要第二个定时器来工作。非常感谢。