2 回答

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
完整的Swing處理是在稱(chēng)為EDT(事件調(diào)度線程)的線程中完成的。因此,如果您要在此線程中進(jìn)行一些長(zhǎng)時(shí)間的計(jì)算,則會(huì)阻塞GUI。
此處的方法是在另一個(gè)線程中處理您的計(jì)算,因此您的GUI保持響應(yīng)。最后,您需要更新您的GUI,這必須在EDT中完成?,F(xiàn)在EventQueue.invokeLater開(kāi)始發(fā)揮作用。它Runnable在Swings事件列表的末尾發(fā)布一個(gè)事件(您的),并在處理完所有先前的GUI事件之后進(jìn)行處理。
也EventQueue.invokeAndWait可以在這里使用。所不同的是,您的計(jì)算線程將一直阻塞,直到您的GUI更新為止。因此很明顯,不能在EDT中使用它。
注意不要從其他線程更新Swing GUI。在大多數(shù)情況下,這會(huì)產(chǎn)生一些奇怪的更新/刷新問(wèn)題。
仍然有Java代碼可以從主線程簡(jiǎn)單地啟動(dòng)JFrame。這可能會(huì)導(dǎo)致問(wèn)題,但不能阻止它搖擺?,F(xiàn)在,大多數(shù)現(xiàn)代IDE都會(huì)創(chuàng)建類(lèi)似這樣的內(nèi)容來(lái)啟動(dòng)GUI:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
所有受支持的平臺(tái)都提供單線程圖形庫(kù)。搖擺是跨平臺(tái)的。因此,Swing GUI對(duì)象應(yīng)僅在事件分發(fā)線程上構(gòu)造和操作。
順便說(shuō)SwingUtilities.invokeLater()一句,是EventQueue.invokeLater()自1.3版以來(lái)的封面。
添加回答
舉報(bào)