[英]Temporarily displaying JPanel over a JFrame window
我正在開發基於主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和多個JPanels。
做到這一點的另一種方法是設計一個狀態機,程序狀態在一個面板中改變。
老實說,這在java的當前狀態下是一個非常困難的問題,出於演示目的,請堅持第一個。 就個人而言,我更喜歡第二種選擇。
這兩種方法都令人沮喪且無效,因為CardLayout並非為游戲屏幕更改而設計,而制作一個嚴重依賴全局狀態的程序確實很難為之...
這可能不是最佳做法,但如果要盡快完成,
我的直接反應是僅使用setContentPane替換JFrame的內容,然后在游戲板上再次調用它以將其重新設置。
我認為對.add的調用與介紹屏幕的工作方式不同,是因為您沒有在添加勝利屏幕之前刪除游戲板,而是在添加游戲板之前刪除了介紹。 也許如果您刪除游戲板然后調用添加將勝利屏幕放進去,它將起作用嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.