回覆:要求在事件分派線程上創建Swing對象。在Java程序中使用多個線程vs vs需要在EDT上創建Swing對象
我正在研究一個應用程序,其目的是監視和顯示各種遠程嵌入式服務器的狀況。我對Java非常陌生,並且我對Swing Objects和EDT的要求的理解並不完整。
主GUI開始對EDT以通常的方式如下,
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
然後,用戶可以選擇對應於所述遠程機器的一個或另一個的一個或多個菜單選項。這樣做的效果是創建一個新的線程,每次如下
new Thread(new VoterStatus(itemNumber)).start();
它調用VoterStatus的類「跑」的方法這反過來又創造了JFrame的一個新窗口。新線程(VoterStatus類的一個實例)然後詢問(TCP等)指定的特定遠程(itemNumber),收集各種信息並將其顯示在JFrame中。
可能有任何數量的這樣的線程對應於VoterStatus的一個實例,它們都會更新它們自己的窗口。這些不同的窗口/ JFrame /任務之間沒有數據共享。
這似乎工作得很好,但是安全嗎?
我違反了在EDT上創建Swing組件的規則嗎?
使用SwingWorker類會有好處嗎?
我希望Java程序員在這些問題上有更多經驗的評論。
感謝 史蒂夫
您是否僅使用EDT來啓動主GUI?如果是,那麼一切都很好。但是,如果在EDT中創建了後續窗口,並且它們的創建時間足夠長(即> 200 ms),則GUI將凍結以便創建新窗口。 – Rogach 2011-02-01 04:30:28
嗨Rogach - 這個評論似乎與其他一些答案略有不同,儘管如果確實如此,我更喜歡它。我正在創建EDT上的主GUI,但其他窗口是在EDT中啓動的線程上啓動的。任何更多的想法。感謝史蒂夫 – Steve 2011-02-02 04:59:10