I've been using a single threaded ExecutorService (Executors.newSingleThread...) to make sure that my calls into AppKit never blocks the EDT (there might be a way to call performSelectorOnMainThread without blocking now that could be used instead). Then I've used a neat hack I found in an old blog (http://jroller.com/santhosh/date/20050625), to make sure I can make blocking calls on the EDT while the EDT still processes events. I might submit my code for inclusion with Rococoa one day if anyone's interested. And of course always call back to Swing using SwingUtilities.invokeLater.
AndyT (lordpixel - the cat who walks through walls)
A little bigger on the inside
(see you later space cowboy, you can't take the sky from me)