2010-08-28 24 views
3

我想在java中實現GUI,但我是初學者。我想澄清一些事情。我讀到爲了保持GUI響應,我應該使用SwingWorker類在單獨的線程中執行任務。好吧到目前爲止。 不,我有一個模型與大約15遠程方法的方法。每種方法都會返回不同的對象類型作爲結果。 在我看來,用戶按下一個按鈕並調用模型中的適當方法。如果不使用迴轉工具,GUI會凍結。我的問題是,我應該創建15個Swingworker線程的子類,並根據用戶的操作創建每個需要的新實例?我的理解是否正確?有沒有一個標準的方式,或者我說的是一個正確的方法?Swing/SwingWorker Beginer的問題

謝謝!

回答

2

看一看這個:Simple Background Tasks

看來你有兩個問題。首先,關於使用SwingWorker時所需的代碼量:您確實需要爲每個操作創建一個SwingWorker的子類,但這並不意味着它們需要是頂級命名類或它們自己的文件中。如文章中所示,它們可以是匿名類,以便代碼位於GUI的事件處理代碼中。其次,關於SwingWorker對象的實例化:您不能重用SwingWorker,但由於作業是由用戶活動(例如,單擊按鈕)執行的,因此您不應該遇到任何實例化的性能問題每次都有新對象。

+0

謝謝。使用匿名類或子類會有什麼不同? – Cratylus 2010-08-28 22:09:41

+0

我對此表示懷疑。匿名內部類的實例具有對封閉類的實例的引用(即佔用更多內存)。您可以使用靜態嵌套類,但是您需要將一些引用傳遞給GUI,以便在作業完成後,可以更新GUI。 (如果你想了解內部和外部靜態嵌套類,請參閱這裏:http://blogs.sun.com/darcy/entry/nested_inner_member_and_top) – 2010-08-28 22:45:05

0

通過一切手段,SwingWorkers完成工作。根據我的經驗,我不喜歡用SwingWorkers來做一件小事。我更喜歡產生一個線程,並讓該線程詢問EventDispatch線程來更新GUI。只有EventDispatch線程應該更新UI,但有一些例外。

我建議在threads in Swing.

閱讀線程雖然線程可以變得沉重,也許這個解決方案將不會在所有情況下爲你工作,如果一個單獨的線程需要Spark在GUI的改變,使用類似,

java.awt.EventQueue.invokeLater(new Runnable() 
{ 

    public void run() 
    { 
     // this codes runs on the event dispatch thread 
     // update the ui here. 
    } 
}); 
+0

不斷增加新的線程,因爲根據我的理解,我們無法集中它們,但是每次與gui進行交互時都會有一個新線程(您描述的方式)? – Cratylus 2010-09-02 10:51:39

+0

線程應謹慎對待。總是有開銷。我認爲某些情況下,後臺線程是合理的。 – Andy 2010-09-03 14:13:20