0

プログラムデータとGUIを更新する予定のwhileループがありますが、whileループが実行されるまでGUI部分がフリーズします。私はSwingUtilities.invokeLater()Swing Timerを使用してみましたがSwingUtilities.invokeLater()作品や方法は、EDT上Swing Timerを使用する方法を私は本当に得ることはありませんWhileループと遅延によるSwing GUIの更新

while(game.getCompTotal() < 17) { 
    try { 
     Thread.sleep(2500); 
    } catch (Exception ex){ 
     ex.printStackTrace(); 
    } 
    game.compHit();   // Program data update 

    updateCardPanels();  // GUI update -- Does not update until the while loop finishes. 

    if(game.checkCompBust()){ 
     if(JOptionPane.showConfirmDialog(this, "Dealer Busted. Play again?") == JOptionPane.YES_OPTION){ 
      init();   // Reset 
     } 
    } 
} 

は、ここに私のコードです。私の質問は、whileループのプログラムデータと同時にGUIを更新する方法です。あなたのwhileループは、EDT上にあり、それが実行されている間、それはGUIがフリーズなぜthatsのよう

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     Timer t = new Timer(100, new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       updateCardPanels(); 
      } 
     }); 
     t.setInitialDelay(0); 
     t.start(); 
    } 
}); 
+0

Swingタイマーは、擬似ループとして使用できます。タイマーの各ティックでは、何らかの種類の状態変数を更新し、終了条件が成立したかどうかを判断し、残りの状態を更新しますあなたが普通に(ループで)そうでなければ – MadProgrammer

+0

OK私はそれが働いていると思います。今私は別の問題があります:プログラムを続行する前に 'Timer'が終了するのを待つ方法はありますか? – CadeLikesToCode

+0

終了した後に 'Timer'呼び出しを行います(つまり、終了条件が満たされた場合) – MadProgrammer

答えて

1
  1. ルックス:ここ

    は私が試みinvokeLater()コードです。 EDTにはThread.sleepを絶対に電話しないでください。

  2. すべてSwingUtilities.invokeLaterは、Runnableをキューに入れて、EDTがある時点でそれを実行するようにします。 SwingUtilities.invokeLaterは、EDT以外のスレッドから実行する必要があります。スウィングタイマーを開始するには、SwingUtilities.invokeLaterは必要ありません。 EDTから直接起動することができます。

  3. スイングタイマーは、実行され、定期的にEDTスレッドで指定されたActionListenerを呼び出す別のスレッドを使用します。

あなたはスイングタイマーでwhileループを交換する(1秒間隔で言うことができます)とそのactionPerformedコール内game.getCompTotal() < 17状態を確認することができます。

関連する問題