2012-10-10 200 views
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

您必須在新線程中啓動循環。 – halex

+0

@halex你可以發表這個答案:) –

+0

這是當我們使用線程來停止循環! – Bernard

回答

4

你需要在一個單獨的線程中運行doJob()(也稱爲 「工作線程」)。當按下按鈕時啓動線程,再次按下時將isStopped標誌設置爲true。小心不要在工作線程中執行UI操作(例如更新進度條) - 有一些特殊方法需要調用以從工作線程更新UI。由於這是一個非常普遍的問題(我的答案也非常一般),所以我建議在Google上關注「AWT ui線程」,「工作線程」和「Java線程」。

一個很好的出發點可能是Lesson: Concurrency in Swing

+0

謝謝,我會研究這些。這很有幫助。 –

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假!

+0

感謝您的回答。 –

0

Perroloco解決方案沒問題,但如果不是使用正常的布爾值而是使用AtomicBoolean,那會更好。 原因是,您將有兩個線程修改/讀取共享資源(工作線程和UI線程)