2011-04-30 12 views
2

私は現在Javaでプログラミングしています。ユーザーがプログラムのスタートボタンを押すと、ループを開始したいと思います。しかし、私は、ユーザーが停止ボタンにループを停止する能力を持っているしたいと思います:ループが開始されるとJava - ループを開始してから実行しますか?

public class Program { 
    private boolean active; 

    // MVC stuff... 

    private class StartListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      // Do stuff... 

      active = true; 
      hotelCalifornia(); 
     } 
    } 

    private class StopListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      // Do stuff... 

      active = false; 
     } 
    } 

    public void hotelCalifornia() { 
     while (this.active) { 
      // The program never leaves! 
     } 
    } 
} 

しかし、プログラムは、ループのアクションを実行します。これを回避する方法はありますか?私の目標を達成する良い方法はありますか?

ありがとうございます!

答えて

4

すべてのイベントは、単一のイベントスレッドで呼び出されます。

頻繁に使用する方法を呼び出すには、Swing Timerを作成してください。

4

まず、ループを新しいThreadで開始する必要があります。

、ユーザーがstop()を押したときに、ループの追加インサイドthread.interrupt()

を呼び出す:Java Swingアプリケーションで

if (Thread.currentThread().isInterrupted()) { 
    break; 
} 
1

私は実行するスレッドを設定し、実行可能な

class basicThread implements Runnable { 
    public void run() { 
     while (true) { 
      // Put the stuff in your while loop here 
     } 
    } 
} 

にwhileループのロジックを置くことをお勧めあなたの実行可能

// Create a thread to execute your runnable 
Thread thread = new Thread(new basicThread()); 

その後

thread.start(); 

StartListenerに以下の呼び出しそして、StopListenerの下にある

thread.interrupt() 
1

考慮すべき点が2つあります。

まず、Event Dispatch Thread内で長時間実行しているプロセスを作成しています。これはあなたが決して行うべきではありません。 Nicanが指摘するように、SwingアプリケーションのすべてのGUIイベントがこのスレッドで呼び出されます。ユーザーがスタートボタンを押すと、StartListeneractionPerformedがEDTで呼び出されます。スイングスレッディングの詳細についてはhereをお読みください。

これは第2のポイントにつながります。hotelCaliforniaを別のスレッドで実行したいと考えています。あなたはBozhoが指摘しているようにthread.interrupt()と呼ぶことができるように、このスレッドを参照することができます。独自の実装で作業するオプションもありますが、activeのvarがvolatileと宣言されていることを確認して、ブール値の状態が新しいスレッドに更新された時点で即座にアクセスできるようにする必要があります。

+0

非常に情報提供しています。これありがとう。 – Peter

1

オプションは、SwingWorkerを使用することです。 もう実行したくないときは、その上でcancel()メソッドを呼び出し、ループ内でisCancelled()をチェックします。