Java 从一个JPanel切换到另一个JPanel,然后再切换回来
多亏@camickr才得以解决 我用JFrame和JPanels构建了一个游戏。游戏一切正常,但我想在两个关卡之间添加一个屏幕,让用户知道他们已经完成了当前关卡,下一个关卡正在加载。 代码应该切换到一个JPanel,等待一秒钟,然后再次切换回加载了新级别的原始区域。我正在使用CardLayout在屏幕之间交换,并尝试使用swing计时器和Thread.sleep()等待,但当我运行代码时,级别之间的JPanel永远不会显示。我认为编译器正在运行该方法中的所有代码,并认为应该在原始JPanel上结束,因此永远不会显示完整的JPanel级别 我在下面创建了一个MVCE,突出了这个问题:Java 从一个JPanel切换到另一个JPanel,然后再切换回来,java,swing,jpanel,cardlayout,Java,Swing,Jpanel,Cardlayout,多亏@camickr才得以解决 我用JFrame和JPanels构建了一个游戏。游戏一切正常,但我想在两个关卡之间添加一个屏幕,让用户知道他们已经完成了当前关卡,下一个关卡正在加载。 代码应该切换到一个JPanel,等待一秒钟,然后再次切换回加载了新级别的原始区域。我正在使用CardLayout在屏幕之间交换,并尝试使用swing计时器和Thread.sleep()等待,但当我运行代码时,级别之间的JPanel永远不会显示。我认为编译器正在运行该方法中的所有代码,并认为应该在原始JPanel上结
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
没有显示计时器逻辑,因此我们无法猜测您可能做错了什么。基本上是切换到临时面板的逻辑。然后你启动计时器。当计时器启动时,您切换回游戏面板。完美。我试着用一个定时器来做两件事,但需要第二个定时器来工作。非常感谢。