1

スタートボタンをクリックするとループを開始するプログラムを書いていますが、ストップボタンで止めたいです。問題は、ループが完了するまでループ開始ボタンが機能しない場合です。私は同様の質問を検索し、問題はループがactionPerformedにあることを理解しましたが、actionPerformedの外でループを取得することができませんでした。新しいクラスを作ってそれを呼び出すなどしてみましたが、まったく同じことが起こりました。ちなみに私はJavaの初心者でもあり、stackoverflowもあります。何か間違ったことをした場合は、申し訳ありません。
単にコーディングする:

OtherClass obj;
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == startButton) {
    while(true) {
        obj = new OtherClass();
        obj.doJob();
    }
    else if(e.getSource() == stopButton) {
    obj.stopLoop();
    }
}

public class OtherClass  {
    private boolean isStopped = false;
    public OtherClass() {
    }
    public void doJob(){
        while(true) {
            //loop...
            if(isStopped) {
                break;
            }
        }
    }
4

3 に答える 3

5

別のスレッド(「ワーカースレッド」とも呼ばれます)でdoJob()を実行する必要があります。ボタンが押されたときにスレッドを開始し、もう一度押されたときにisStoppedフラグをtrueに設定します。ワーカースレッドでUIアクション(進行状況バーの更新など)を実行しないように注意してください。ワーカースレッドからUIを更新するために呼び出す必要のある特別なメソッドがあります。

これは非常に一般的な質問なので(私の答えも非常に一般的です)、Googleで一般的に「AWTuiスレッド」、「ワーカースレッド」、「Javaスレッド」を探すことをお勧めします。

良い出発点は、レッスン:Swingでの並行性です。

于 2012-10-10T14:04:44.030 に答える
0

スレッドを使用する必要があります。メインスレッドでループを実行すると、ループが終了するまでGUIがフリーズします。

どうぞ:

class yourClass{
...
private volatile boolean threadRunning = false;

public void startThread(){
  Thread t = new Thread(new Runnable(){
      @Override
      public void run(){
          threadRunning = true;
          while(threadRunning){
              //do some job
          }
      }
  });
  t.start();
}

ループを停止するには、ボタンを追加し、threadRunningをfalseに設定します。

于 2012-10-10T14:06:01.427 に答える
0

Perrolocoソリューションは問題ありませんが、通常のブール値を使用する代わりに、AtomicBooleanを使用する方がよいでしょう。その理由は、共有リソースを変更/読み取る2つのスレッド(ワーカースレッドとUIスレッド)があるためです。

于 2012-10-10T14:49:34.397 に答える