有這篇文章:EDT隊列切割
有人插隊! 時不時會發生一些揮杆事件在事件隊列中以不正確的順序處理(並且沒有任何東西會讓我的血液沸騰,就像有人切入隊列一樣)導致奇怪的行爲。這是最好的一個小代碼片段。閱讀下面的代碼片段,仔細想想你想象事件發生的順序。
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
repaint();
doSomething();
}
});
大多數開發人員會想象,repaint()方法將導致繪製操作在doSomething()方法調用之前發生。但實際上並非如此,調用repaint()將創建一個新的繪圖事件,該事件將添加到事件隊列的末尾。這個新的繪畫事件將僅在當前的行動事件完成後處理(派發)。這意味着doSomething()方法將在調度隊列上的新Paint事件之前執行。
這裏的關鍵是調用repaint()將創建一個新的paint事件,該事件將被添加到結束事件隊列中,而不是立即處理。這意味着沒有任何事件會跳過隊列(並且我的血液可以保持在正確的溫度)。
我的問題是,我怎麼能強迫的Swing做repaint();
之前doSomething();
?
此外,如果在doSomething();
之內有repaint()
方法的調用,則只有在doSomething();
完成後纔會執行它們。有沒有辦法讓我暫停doSomething();
mid-executin,然後投入reapaint();
,完成它,然後恢復doSomething();
?
只有我已經找到了解決辦法,到目前爲止是this(link),但它不是真正實用...
與往常一樣的問題(你知道我仍然認爲你正在做一些根本性的事情 - 當組件被繪製時,應該無所謂,有時候 - 改變後應該足夠好;-) - 爲什麼? – kleopatra
不會減少你只丟失了所有事件,方法和通知, – mKorbel