暂时在JFrame窗口上显示JPanel

时间:2013-04-02 01:56:14

标签: java swing graphics jframe jpanel

我正在开发一个基于主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); 
}

遗憾的是,这并没有显示任何内容。我尝试了各种addsetVisiblevalidate等等,并查看了其他一些问题,但似乎没有任何效果。我还尝试将victoryScreen声明放在初始欢迎屏幕旁边并将其设置为不可见(然后在我想要显示时将其设置为可见),但这只是在最开始时将灰色面板放在所有内容上。似乎什么时候构建它,它会自动绘制。让董事会成为另一个JPanel层似乎风险很大,但我对JSwing知之甚少。

无论如何,我很难过。有关制作胜利屏幕(最终是其他人)的程序的任何建议都会显示出来吗?

*编辑:以下是我为屏幕显示类覆盖paintComponent的方式:

public void paintComponent(Graphics g){ 

              //works fine for welcome screen
      g.drawImage(screenImage, 0, 0, 960, 540, null); 
      repaint(); 
}

2 个答案:

答案 0 :(得分:2)

一种方法是使用CardLayout和多个JPanel。

另一种方法是设计一个状态机,程序状态在一个面板中发生变化。

老实说,这是java当前状态下的一个非常困难的问题,出于示范目的,坚持第一个。就个人而言,我更喜欢第二种选择。

这两种方法都令人沮丧而且没有效果,因为CardLayout不是为游戏屏幕更改而设计的,而制作一个严重依赖于全局状态的程序真的很难推理......

答案 1 :(得分:1)

这可能不是最佳做法,但如果它很快到期 -

我的直接反应是只使用setContentPane替换JFrame的内容,然后再次使用游戏板调用它以将其设置回来。

我认为对.add的调用与对介绍屏幕的调用方式不同的原因是你在添加胜利屏幕之前没有移除游戏板,但你确实在添加之前删除了介绍游戏板。也许如果你删除游戏板,然后调用添加放置胜利屏幕将有效吗?