2010-05-18 41 views

回答

3

看起來paint()方法在event dispatch thread之外被調用,這確實會導致非常奇怪的行爲,這就是爲什麼永遠不應該這樣做。

相反的paint(),應用程序代碼應該只調用過repaint()

+0

謝謝邁克爾。 'paint(Graphics)'正在從'update(Graphics)'被調用。我改變了'update()',所以它現在調用'repaint()',它似乎工作到目前爲止...... – Armand 2010-05-18 11:37:12

+0

@Michael任何想法,如果可以從'update(Graphics)'調用'repaint()'是安全的? – Armand 2010-05-18 14:06:15

+0

@Alison:調用repaint()是安全的,因爲它基本上只是將一個事件放入EDT隊列中,該隊列已正確同步。 – 2010-05-18 14:19:18

1

只能在一個線程中調用paint方法,即Event Dispatch Thread,所以不需要同步。我會想象問題的根源在於組件的使用方式。請看this link以瞭解圍繞UI中併發性的一些想法。

+0

有趣。就我而言,同步確實解決了問題,很明顯,它是從多個線程中調用的。我會調查可能發生的情況。 – Armand 2010-05-18 11:26:25

+1

允許在不同線程中運行的其他方法在理論上可以保持相同的鎖定。 – 2010-05-18 11:28:32

+0

@Tom很好的一點,它解釋了爲什麼同步paint()解決了這個問題 - 事情發生在另一個同步線程中,它改變了佈局中的paint。 – Armand 2010-05-18 16:32:30

相關問題