views:

70

answers:

3

I have built my own component extending JPanel. I've added a few methods like calculateWhatever()... Should I call those methods with invokeLater() as well? Substance L&F is not complaining about it but I'm having rare random painting problems and I'm wondering If they're happening because of those calculations inside the extended swing component.

+2  A: 

If you are doing a large number of calculations then it would be prudent to execute them in a thread other than the event dispatch thread. If you are using JDK 1.6 you could also use the SwingWorker class rather than invokeLater.

Taylor Leese
So, just being methods from an extended swing component implies running in the EDT by default?
ktulur
Take a look at this article. It's a good summary. http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html
Taylor Leese
A: 

You only need to invoke these methods using invokeLater() (or using the SwingWorker) when you are modifying your component (or painting on it) from within these methods. If you merely do calculations you only need to synchronize when accessing the result in e.g. the paint() method.

Bombe
A: 

You should generally use SwingUtilities.invokeLater or the SwingWorker to isolate the changes to GUI components from any potential locking scenarios (file I/O or remote server calls) or processor intensive operations. If your calculations do any disk reading or writing, or if you make calls to a server, I would suggest that you reorganize your code to do all of you painting calls in the AWT thread. Likewise if you realize your calcs are taking too long to complete and your GUI seems sluggish, breaking them out would be prudent.

akf