2015-11-06 49 views
1

的方法,我有一個的SwingWorker稱爲任務1,如何停止名爲靜態的doInBackground()的SwingWorker

class Task1 extends SwingWorker<Void, Void> { 
     @Override 
     public void doInBackground() { 
      String[] args = {}; 
      try { 
       FeatureSetBuilder.main(args); //<---It is a static method 


      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 

      return null; 
     } 
     public void done() { 

      UISettings.FP_GENERATOR_DIALOG_2.cancelButton.setEnabled(true); 
      loadingDialog.progressBar.setIndeterminate(false); 
      loadingDialog.setVisible(false); 
     } 
    } 

而且我有一個按鈕,將執行任務1,

  public void actionPerformed(ActionEvent e) { 
       System.out.println("FeatureSetBuilder - Start"); 
       String[] args = {}; 
       try { 
        task1 = new Task1(); 
        task1.execute(); 
        loadingDialog.popOut(task1); 
        task1.cancel(true); 



       } catch (Exception e1) { 
        e1.printStackTrace(); 
       } 
       System.out.println("FeatureSetBuilder - Finished"); 

      } 

當我點擊這個botton,會彈出一個帶有進度條的對話框,指示FeatureSetBuilder.main(args)方法正在運行。當task1完成時,done()方法將被調用並關閉該對話框。

它工作正常。

我想添加一個取消按鈕到該對話框,以便用戶可以隨時終止任務1。

這裏是我的取消按鈕,

cancelButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Stop the current SwingWorker"); 
        task.cancel(true); 
        setVisible(false); 
       } 
      }); 

當我按下取消按鈕,任務1被似乎終止「FeatureSetBuilder - 成品」被打印出來。但是,靜態方法FeatureSetBuilder.main(args)仍在運行。

+0

這與Swing和所有的事情沒有關係 - 「」我該如何停止運行Java代碼?「我首先要做的不是運行另一個類的主要方法,而是讓代碼更符合OOP標準。接下來,我將研究一些通知機制,以允許任何進程詢問正在運行的代碼以徹底停止自己。正如預期的那樣,魔鬼將在細節中。 –

回答

3

您的doInBackground方法應定期檢查任務是否已被取消。從SwingWorker類的javadoc的例子:

@Override 
public List<Integer> doInBackground() { 
    while (! enough && ! isCancelled()) { 
      number = nextPrimeNumber(); 
      publish(number); 
      setProgress(100 * numbers.size()/numbersToFind); 
     } 
    } 
    return numbers; 
} 

我真的建議您在SwingWorker及相關類讀取所有的類/方法的javadoc。 EventDispatchThread相關問題可能非常棘手。

+1

並參見http://stackoverflow.com/questions/9536555/utility-of-future-cancelboolean-method –

+1

除了檢查'isCanceled',因爲OP正在調用'task.cancel(true)'我也會處理中斷(如'InterruptedException'和'Thread.interrupted()')。相關的Oracle教程頁面:[取消後臺任務](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/cancel.html),[中斷](https://docs.oracle.com/javase/教程/本質/併發/ interrupt.html)。 –

+0

我明白了。非常感謝 –

相關問題