2010-02-18 39 views
5

我想知道SwingWorker必須是我的主GUI中的嵌套類。我寧願讓它成爲一個外部類,讓我的任何程序邏輯都清楚GUI。SwingWorker必須是嵌套類嗎?

我試圖讓SwingWorker類是外部的,對於這個過程來說工作正常,但不幸的是我無法從SwingWorker類訪問任何我的GUI字段。 每當我嘗試訪問一個屬性,比如標籤或SwingWorker的done()方法中的任何內容,我都會得到一個nullPointer異常。

任何意見將不勝感激!


首先非常感謝你傑夫!到目前爲止工作得很好,儘管我不能跟隨你提出的第二種選擇。 我的後臺任務之一會計算一定的大小(長整型值),所以從我的GUI中獲取該值是很好的選擇。

你建議與getter和setters一起工作,但不幸的是我不知道如何在SwingWorker類中實現它們。

我嘗試了這樣的:

public void setSize(long totalSize) { 
    this.totalSize = totalSize; 
} 
public long getTotalSize() { 
    return totalSize; 
} 

設定器是在doInBackground()方法的結束時被調用。不幸的是,我無法使用我的GUI中的get()方法。

final MySwingWorker w = new MySwingWorker(); 
Runnable r = new Runnable() { 
    public void run() { 
     // do something with w.get() 
    } 
}; 
w.setRunnable(r); 
w.execute(); 

由於構造函數需要Runnable對象,因此「w」的對象創建不起作用。 我錯過了什麼嗎? 請在我身上輕鬆一下,這是我第一次與SwingWorker合作。 :) 再次,非常感謝您的幫助!

回答

6

您可以使SwingWorker成爲外部類。但是,就像任何其他類一樣,如果它看不到變量(例如您想設置的標籤),當然它將無法設置它。你可以做的一件事是傳遞一個Runnable,它在完成時執行。現在

public class MySwingWorker extends SwingWorker { 

    private final Runnable r; 
    public MySwingWorker(Runnable r) { 
     this.r = r; 
    } 
    public void doInBackground() {...} 
    public void done() { r.run(); } 
} 

從GUI,你可能會做這樣的事情

Runnable updateLabel = new Runnable() { 
     public void run() { 
      label.setText("myValue"); 
     } 
}; 
SwingWorker w = new MySwingWorker(updateLabel); 
w.execute(); 

,如果你想使用的SwingWorker的結果,雖然這有可能變得有點棘手。而不是傳遞了Runnable到擺動工人的構造函數,你將有一個setter方法,然後它會是這樣的:

final MySwingWorker w = new MySwingWorker(); 
Runnable r = new Runnable() { 
    public void run() { 
     // do something with w.get() 
    } 
}; 
w.setRunnable(r); 
w.execute(); 

在這兩種情況下,可運行在類似的功能,以執行一個閉合當工人完成。

+0

也可以簡單地在構造函數中傳遞Label而不是在Runnable中傳遞。爲每個小動作定義一個新的工作者子類可能會過度殺傷。匿名類非常適合解決這個將一個非常小的,緊密耦合的對象放在一起的特殊問題。 – 2010-02-18 15:15:57

+0

這真的取決於這是否是單個用例。如果你在很多地方做這個抽象的話,這個抽象就行得通。哦,關閉會有幫助。 – 2010-02-18 15:52:31

相關問題