2013-04-02 123 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的調用與前面介紹的屏幕沒有相同的作用,是因爲在添加勝利屏幕之前,您並沒有移除遊戲板,但是您之前確實刪除了前面的介紹添加遊戲板。也許如果你刪除遊戲板,然後打電話添加把勝利屏幕在它會工作?