我正在开发一个基于主 JFrame 的图形棋盘游戏程序。游戏板本身源自 JPanel。
我希望当有人获胜时能够在整个窗口上显示“胜利屏幕”。我想我可以从一开始就成功显示的“欢迎屏幕”来扩展这个想法。当此代码运行时,欢迎屏幕出现,持续 2 秒钟,然后消失,游戏板出现并准备玩。希望这些基本部分能够提供有关我如何设置它的足够信息:
public class MyGame{
public static Board b; //Board extends JPanel
public static Window gameWindow; //Window extends JFrame
...
public static void main(String args[]) throws IOException{
...
gameWindow = new Window("My Game");
//DisplayScreen extends JPanel
DisplayScreen intro = new DisplayScreen("welcomeScreen.png");
gameWindow.setSize(960, 570);
gameWindow.add(intro);
gameWindow.setVisible(true);
wait(2); //just a function I wrote
...
b = new Board("board.png");
...
gameWindow.remove(intro);
gameWindow.add(b);
gameWindow.repaint();
gameWindow.setVisible(true);
...
}
...
}
诚然,我们需要进行大量的试验和错误才能使其发挥作用。然而,就我的一生而言,我无法弄清楚如何在游戏后期的某个时刻暂时显示胜利屏幕。我认为我可以通过中心 MyGame
类中的函数来完成此操作(我已在 Window
类和其他地方尝试过,但没有成功)。像这样的东西:
public static void VictoryScreen(){
DisplayScreen victoryScreen = new DisplayScreen("victoryScreen.jpg");
victoryScreen.setVisible(true);
gameWindow.add(victoryScreen);
}
不幸的是,这没有显示任何内容。我尝试了 add
、setVisible
、validate
等各种方式,并查看了其他一些问题,但似乎没有任何效果。我还尝试在初始欢迎屏幕旁边声明 victoryScreen
并将其设置为不可见(然后在我想要显示它时将其设置为可见),但这只是在所有内容上放置了一个灰色面板非常开始。似乎当某些东西被构造时,它就会自动绘制。将主板作为另一个 JPanel 层似乎相当冒险,但我对 JSwing 知之甚少。
无论如何,我都被难住了。关于使胜利屏幕(以及最终其他屏幕)按需要显示的程序有什么建议吗?
*编辑:这是我覆盖屏幕显示类的 paintComponent
的方式:
public void paintComponent(Graphics g){
//works fine for welcome screen
g.drawImage(screenImage, 0, 0, 960, 540, null);
repaint();
}
最佳答案
一种方法是通过 CardLayout 和多个 JPanel。
另一种方法是设计一个状态机,其中程序状态在一个面板中发生变化。
老实说,在当前的 java 状态下,这是一个非常困难的问题,出于演示目的,请坚持第一个问题。就我个人而言,我更喜欢第二种选择。
这两种方法都令人沮丧且无效,因为 CardLayout 不是为游戏屏幕变化而设计的,而制作一个严重依赖全局状态的程序确实很难推理......
关于java - 在 JFrame 窗口上临时显示 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15754828/