2013-04-02 72 views
0

我正在研究基于主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); 
} 

不幸的是,这不显示任何内容。我尝试过所有的方式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(); 
} 
+0

为什么不使用['CardLayout'](http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)? – MadProgrammer

+0

我想我没有读到他们足够的。现在看起来有点晚了,因为在接下来的24小时内这个主要项目将会是Java/Swing初学者。 :( – nicole

+1

@MadProgrammer ..或一个JLayeredPane或玻璃窗格或.. –

回答

2

一种方式做到这一点是CardLayout和多JPanels。

另一种方法是通过设计一个状态机,其中程序状态在一个面板中更改。老实说,这是目前Java状态下的一个非常困难的问题,并且为了示范目的坚持第一个目标。就个人而言,我更喜欢第二种选择。

这两种方法都是令人沮丧的,而不是有效的,因为CardLayout不是为游戏画面的变化,而做节目,在很大程度上依赖于全局状态真的很难推理...

1

这可能不是最好的做法但如果它是如此快 -

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

之所以我认为.add的调用与前面介绍的屏幕没有相同的作用,是因为在添加胜利屏幕之前,您并没有移除游戏板,但是您之前确实删除了前面的介绍添加游戏板。也许如果你删除游戏板,然后打电话添加把胜利屏幕在它会工作?