2011-01-11 100 views
1

我有一個程序,一個遊戲,用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以某種方式做它最遠的,但不知何故,聽起來並不像做我想要什麼的好方法。

有什麼建議嗎?

回答

1

我想你在edt中啓動你的引擎循環。如果是這樣,那很糟糕。

從edt調用另一個線程,並從這個新線程管理您的引擎。對於gui更新,請回憶edt SwingUtilities.invokeLater

或者最好使用SwingWorker

要閱讀一些有關長期工作的英文文檔,請參見Concurrency in Swing。不要使用Thread.sleep。

+0

如果我讓我的遊戲引擎運行並使run()方法超出遊戲循環方法,遊戲循環方法中的Thread.sleep調用是否會暫停我的遊戲引擎運行的線程?對不起,如果我很困惑。 – JLeNoir 2011-01-12 07:21:51

1

當我刪除代碼,開始遊戲循環的片段中,遊戲視圖顯示在屏幕上通常

聽起來你很可能使用了的Thread.sleep while循環。

更好的方法是使用Swing Timer來安排遊戲的「循環」。

相關問題