2016-11-06 6 views
0

これは私のプログラムです。私は理解していません、なぜbtnStopの2番目のActionListenerが動作しません。私は、btnStartでwhileループを開始します。しかし、私はそれを止めることはできません。誰かがなぜ私を説明することができますか?最初のActionListenerがまだビジー状態の場合は、2番目のActionListenerをアクティブにする方法は?

パブリッククラスActionFrame読むthe tutorial on Swing concurrencyのJFrame {

JButton btnStart = new JButton("Start"); 
JButton btnStop = new JButton("Stop"); 
boolean flag = false; 

public ActionFrame() { 
    setLayout(new FlowLayout()); 
    setSize(600, 600); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setVisible(true); 
    add(btnStart); 
    add(btnStop); 

    btnStart.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      flag = true; 
      System.out.println("Start waitForFlag()"); 
      waitForFlag(); 
     } 
    }); 

    btnStop.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      flag = false; 
     } 
    }); 
} 

public void waitForFlag() { 
    while (flag) { 
     try { 
      Thread.sleep(500); 
      System.out.println("Test"); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

}

+0

あなたは2人のリスナーでこれを複雑にしているようです。 1つのリスナーを持ち、外部変数を設定/参照して、どのようなアクションを取るべきかを判断するのがベストです。例えば、変数は時間です。 また、バックグラウンドスレッドについても読んでください。単にフラグを変更してもスレッドは中断されません。 – saywhatnow

答えて

0

を拡張します。

すべてのスイングイベントリスナーは、単一のスレッド、つまりイベントディスパッチスレッドで呼び出されます。そのうちの1つで無限ループを開始すると、他のリスナーが呼び出されるのを防ぎ、UI全体が再描画されるのを防ぎ、UI全体をフリーズします。

イベントリスナーは、長続きするタスクを実行してはいけません。これらは別のスレッドで実行する必要があります。

関連する問題