2011-01-11 4 views
1

は、私は、Swingで作られたGUIで、プログラム、ゲームを持っています。タスクが完了してからイベントディスパッチスレッド内で続行するまでの待機方法を教えてください。

GUIは、カードなどの複数のJPanelを持っていたJFrameを継承し、CardLayoutとのJPanelを保持している私自身のクラス、で構成されています。

これらのパネルの1つにはゲームを開始するボタンがあり、ゲームビューはカードの1つにあります(JPanelを継承する独自のクラスを持つビューオブジェクトがコンストラクタ内のカードに追加されます) JFrameの)。今

プロローグ:

私はのJButtonを押すので、私はactionPerformedメソッドを実行するイベントディスパッチスレッドにジャンプ。私が最初に私はプレーするつもりだレベル、(レベルに応じてインスタンス化された)ゲームエンジンをインスタンス化し、その後、表示パネルを保持しているカードに反転し、この方法では

。次に、私はビューオブジェクト(アプリケーションウィンドウにペイントされるゲームで終わるはずです)を描き直してから、ゲームエンジンオブジェクトを呼び出してゲームループを開始します。

私の問題は、次のとおりです。(私はコンソールの印刷物からそれを参照してください)私はボタンを押すと、ゲームエンジンが正常に実行するために開始されます

が、私のGUIがフリーズし、ゲームのビューを表示するために更新されません。ゲームループを開始するコードスニペットを削除すると、ゲームループが開始されていないため、ゲームビューは通常画面に表示されますが、何も移動しません。

Javaではすべてが書かれた順番で実行されないので、actionperformedメソッドの他の操作が完了する前にゲームループが起動し始めるので、私はそれを控除しました。ここで

はのactionPerformedメソッド kortti =カード kentta =レベル valikkopaneeli = Peliは、私はそれはJFrameの

を継承作られたクラスを=ゲームを開始cardlayout aloitusnappula =ボタンを持っているパネルから関連の抜粋です
if (e.getSource() == aloitusnappula) { 

CardLayout kortti =(CardLayout)valikkopaneeli.getLayout(); ケンタケンタ=新しいケンタ( "testikentta.txt"); kortti.show(valikkopaneeli、 "Peli"); Peli.this.pack(); Peli.this.setVisible(true); aloita(kentta); }

ここaloita(kentta)メソッドの抜粋である:

Pelimoottoriゲームエンジンクラス nakyma =ビュー・オブジェクト peliLooppi()はゲームエンジンにおける方法==
public void aloita(Kentta kentta) { 
moottori = new Pelimoottori(Peli.this, kentta); 
nakyma.repaint(); 
moottori.peliLooppi(); 
} 

私はaloita方法からmoottori.peliLooppi()の呼び出しを削除したい場合は、ゲームループ

を起動するためのクラスでは、ゲームのビューは、通常表示されるでしょう。

私はいくつかの答えをグーグルしようとしましたが、私が持っている最も遠いは何とかSwingWorkerのでそれをやっているが、何とかそれは私が何をしたいことの良い方法のような音はありません。

提案がありますか?

答えて

1

edtの内部でエンジンループを開始するとします。もしそうなら、それは悪いです。

edtから別のスレッドを呼び出し、この新しいスレッドからエンジンを管理します。 GUIアップデートの場合は、SwingUtilities.invokeLaterを呼び出す。

また、SwingWorkerを使用するのが最適です。

スイングでの長期間の仕事に関する英語の優れたドキュメントを読むには、Concurrency in Swingを参照してください。 Thread.sleepは使わないでください。私はゲームループを開始し、コードのスニペットを削除すると

+0

ゲームエンジンを実行可能にして、ゲームループメソッドを実行するrun()メソッドを作成すると、ゲームループメソッドからのThread.sleep呼び出しは、ゲームエンジンが実行中のスレッドを停止するだけですか?私は混乱している場合は申し訳ありません。 – JLeNoir

+0

私はあなたにチュートリアルを提案する私の貢献を逆転しました。 – Istao

+0

ゲームループを実行するにはSwingWorkerを使うべきですか? – JLeNoir

1

は、ゲームビューでは、おそらくのThread.sleepとwhileループを使用しているように、通常

が鳴り、画面に表示されます。

より良いアプローチは、Swing Timerを使用してゲームの「ループ」をスケジュールすることです。

関連する問題