2011-05-15 37 views
3

在我的方法的doWork()我叫SwingUtilities.invokeLater()

SwingUtilities.invokeLater(new Runnable(){ 
public void run() { 
button.setBackgroundColor(Color.red); 
} 
}); 

然後我打電話

SwingUtilities.invokeLater(new Runnable(){ 
public void run() { 
button.setBackgroundColor(Color.blue); 
} 
}); 

問題是否將成爲按鈕爲紅色,那藍色的,藍色或紅色,然後?

回答

0

據我瞭解docs,它應該是red然後blue,因爲第一個事件首先添加到事件隊列(以及..)。

9

invokeLater()將其參數添加到Swing事件隊列中。所以他們將按照他們添加的順序執行,即先是紅色然後是藍色。

+0

請參閱:https://groups.google.com/forum/m/?fromgroups#!topic/comp.lang.java.help/Tt1S9qEJqTc – assylias 2012-10-30 08:39:15

+0

@assylias:API文檔說該調用實際上是由'java.awt.EventQueue',其API API明確指出事件是按順序排列的,按照排列順序排列。 – 2012-10-30 10:33:41

+0

javadoc也說「*注意發佈到EventQueue的事件可以合併*」 - 我有點困惑。 – assylias 2012-10-30 10:52:00

0

實際上,您可能在重新繪製按鈕本身時遇到問題。

IIRC,setBackground()只會更改背景字段並觸發重繪事件(通過調用repaint())。但即使在美國東部時間被調用,實際重繪也不會立即發生。相反,它會發送一個繪畫事件,稍後將處理(可能與其他繪畫事件聚合)。

因此,如果有兩個呼叫invokeLater()之間在你的代碼「一無所有」,那麼你可能只看到了最後的顏色設置,即藍色,並且從來沒有看到紅色的背景可言,但是這取決於很多在中間的代碼上。

舉例來說,如果你已經把之間的sleep(),那麼你可能會看到兩種顏色,第一紅色然後藍色

相關問題