2011-04-30 71 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

所有的Java Swing應用程序的事件被稱爲在一個單一的事件線程。

您應該創建一個Swing Timer以便隨時調用任何您想要的方法。

4

首先,您必須在新的Thread中啓動循環。

然後,當用戶按下stop(),叫thread.interrupt()

在循環內部添加:

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

我建議把邏輯while循環中運行的

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

建立一個線程來執行你的可運行

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

然後下面調用StartListener

thread.start(); 

並且在StopListener下面

thread.interrupt() 
1

有兩件事情需要考慮。

首先,您正在事件調度線程內創建一個長時間運行的進程。這是你永遠不應該做的事情。正如Nican指出的那樣,您的Swing應用程序中的所有GUI事件都將在此線程中調用。當用戶按下開始按鈕時,您的中的actionPerformed將在EDT中被調用。有關Swing Threading的更多信息,請閱讀here

這導致了第二點:您將需要在不同的線程中運行您的hotelCalifornia。你可以保留這個線索的引用,這樣你可以打電話thread.interrupt() Bozho指出。您也可以選擇使用自己的實現,但是您需要確保將active var聲明爲volatile,以便在新線程更新後立即可以訪問布爾值的狀態。

+0

非常有幫助。這次真是萬分感謝。 – Peter 2011-04-30 07:20:32

1

選項將使用SwingWorker。 當你不再需要它運行時,調用它的cancel()方法,並檢查循環中的isCancelled()。