2012-02-24 28 views
1

guiのボタンが押されたときに私のプログラムがwhileループから抜け出そうとしています。if文がwhile(真)ループで実行されていない

GUIスレッドを起動するスレッドがあり、適用ボタンが押されるまで待機します。 は、ここでは、コードです:

public void run() {  

     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      }   
     }); 

     // Wait until apply button clicked and set team 
     while(true) { 

      applyClicked = gui.getApplyClicked(); 
      if (applyClicked == true) { 
       teamYellow = gui.getTeam(); 
       break; 
      } 
     } 

しかしでも、私は、[適用]をクリックしますとapplyClickedはそれがif文を実行しないGUIの中に真になります。

ただし、真下の印刷行を追加すると、それは正常に動作します。

また、行ごとにデバッグして、変数を正しく設定しても機能します。

なぜ私はprintlnを持っていないときにこれが動作しないのですか?スレッドとは何か?

おかげ

+6

「volatile」? (また、忙しい待っているループ、悪い!) –

+0

揮発性が働いた。どのように私はGUIから忙しい待機ループなしでループを含むクラスにブール値を得るだろうか? – sam

答えて

5

あなたはbusy-waitループを実行しています。これはあなたのCPUパワーをすべて消費すると思います。 代わりに、apply-buttonにactionListenerを追加し、actionPerformedメソッドであなたのものを実行する必要があります。

+0

こんにちは、私は現在、GUIクラスで何をやっています。 actionPerformedメソッドは、ボタンがクリックされたかどうかを示すブール値を変更します。次に、同じクラスのゲッターを使用して、上のループを含むクラスでこのブール値を取得します。 – sam

+0

このクラスをbuttonsイベントのリスナーとして追加できませんでしたか?その後、あなたは本当に持っていたくないビジーウェイトループを削除することができます。 –

+0

ごめんなさい。したがって、現在busy-waitループを持つクラスはRunnerと呼ばれ、GuiクラスはMainGuiと呼ばれ、そのインスタンスはRunnerクラスのguiと呼ばれます。現在、私は、ボイド公共のactionPerformed(のActionEvent arg0に)ログには、ボタンを含むパネルであるMainGuiクラスで{... ' 。どうでしょう\t \t @Override {' log.apply.addActionListener(新しいのActionListener()を呼び出します私はRunnerクラスをリスナーとして追加します。 – sam

0

これは、あなたが正確に探している答えであるが、applyClickedがtrueの場合ので、念のために、ループの外側applyClickedを定義し、ブレークが必要とされないようにwhile(!applyClicked)としてループを宣言しない場合があります、ループはそれ自身で終了します。それでも問題が解決しない場合は、デバッガで新しいコードを実行してください。これはうまくいかないかもしれませんが、単なる提案です。

関連する問題