我有一個程序,一個遊戲,用Swing製作的GUI。如何等待任務完成,然後在事件分派線程中繼續?
的GUI是由我自己的類它繼承JFrame的,並持有與CardLayout一個JPanel,裏面有多個JPanels的卡。
在其中一個面板上有一個按鈕,它啓動遊戲,遊戲視圖位於其中一張卡片上(視圖對象具有自己的類,它繼承JPanel,被添加到構造函數中的卡片上的JFrame)。
現在的序幕:
我按下JButton的,所以我跳到事件調度線程來執行actionPerformed方法。
在該方法中予先翻轉到保持視圖面板的卡,然後實例我要去玩的水平和遊戲引擎(其根據電平實例化)。然後我調用視圖對象重畫(它應該以遊戲被繪製在apllication窗口中),然後我調用我的遊戲引擎對象來啓動遊戲循環。
我的問題是:
當我按下按鈕,遊戲引擎開始正常運行(我看到它在控制檯中打印),但我的GUI凍結,不會刷新,展示遊戲視圖。當我刪除啓動遊戲循環的代碼片段時,遊戲視圖通常顯示在屏幕上,但沒有任何動作,因爲遊戲循環尚未啓動。
所以我推斷,因爲在Java中,一切都不會按照它寫入的順序發生,所以遊戲循環開始運行之前,actionperformed方法中的其他操作已經完成。
下面是從actionPerformed方法相關片斷 kortti =卡 kentta =水平 valikkopaneeli =已cardlayout aloitusnappula面板=啓動該遊戲 的Peli = I類製成,它繼承的JFrame
按鈕if (e.getSource() == aloitusnappula) {
CardLayout kortti =(CardLayout)valikkopaneeli.getLayout(); Kentta kentta =新Kentta(「testikentta.txt」); kortti.show(valikkopaneeli,「Peli」); Peli.this.pack(); Peli.this.setVisible(true); aloita(kentta); }
和這裏是aloita(kentta)方法的一個片段:
public void aloita(Kentta kentta) {
moottori = new Pelimoottori(Peli.this, kentta);
nakyma.repaint();
moottori.peliLooppi();
}
其中Pelimoottori =遊戲引擎類 nakyma =視圖對象 peliLooppi()=該方法,在遊戲引擎啓動遊戲循環
如果我刪除moottori.peliLooppi()從aloita方法調用類,遊戲顯示會正常顯示。
我想谷歌的一些答案,我有跟的SwingWorker以某種方式做它最遠的,但不知何故,聽起來並不像做我想要什麼的好方法。
有什麼建議嗎?
如果我讓我的遊戲引擎運行並使run()方法超出遊戲循環方法,遊戲循環方法中的Thread.sleep調用是否會暫停我的遊戲引擎運行的線程?對不起,如果我很困惑。 – JLeNoir 2011-01-12 07:21:51