Start by downloading Griffon and install it, no hurries, take your time, I'll wait... done?! ok let's continue

griffon create-app workerTest
That should give you the barebones, if you don't believe me then issue the following command to run the app
griffon run-app
Alright! let's continue, on the threading rule post it was mentioned that SwingBuilder exposes two handy methods for invoking code inside/outside of the EventDispatch Thread, named doLater and doOutside. Now remember that somewhere before Jdk6 was released the Swinglabs project added another handy way to deal with threading in Swing: SwingWorker. It turned out to be a very good idea, so good that it was later added to the JSL, so now you have an option if your are running either jdk5 (Swinglab's SwingWorker) or jdk6 (Jdk6 SwingWorker), problem is that those classes are located in different packages.
Oh boy, can-t we have a simplified version? sure we can! enter the withWorker() node from SwingXBuilder. This node is smart enough to use either class depending on your runtime JVM, so you have to concentrate only on getting things done. Back to Griffon, one of its key components (the CompositeBuilder) allows you to mix&match builders based on FactoryBuilderSupport, FBS in turn has a pretty cool, convention driven approach to group together a set of related nodes, for example the threading ones. By grouping nodes together FBS is also able to 'lend' those nodes to external classes, like Griffon's controllers. This means that you can call doLater for instance from your controller as it it were a method defined on the controller itself, wicked!
Let's add withWorker to your sample controller, shall we? open up griffon-app/conf/Builder.config in your favorite editor and type
It looks like magic isn't it? if you want to find out more about the available groups search for all register* methods in the builders for the time being (docs coming soon!). Where to now? let's fill up the model (griffon-app/models/WorkerTestModel.groovy) and view (griffon-app/views/WorkerTestView.groovy) next
@Bindable makes it so easy to write observable beans. On to the view
Hopefully the code is self explanatory, an action is created inside the actions group, which is a placeholder for all actions, that way an action is not added accidentally to a component. Notice that the action's enabled property is bound to the model, so it is the label's text property. We will be updating those properties inside the controller (griffon-app/controllers/WorkerTestController.groovy) , which is the one shown next
We have reached the culmination point, withworker() will create an instance of SwingWorker suitable for your runtime JVM. It accepts a DSL-like definition of its tasks and what it should do once it finishes them. Additional info on those closures
- onInit - behaves like a constructor, it is called once just before the worker starts.
- work - the body of the task. you may call publish() at any point to send updates to the UI
- onUpdate - handles the data made available by publish(), its parameter is of type List
- onDone - handles the termination of the task
griffon run-app
Woops almost forgot, you will need SwingXBuilder 0.1.6-SNAPSHOT and its dependencies, place them on workerTest/lib or else you'll get a nasty ClassNotFoundException (and we don't want that

Keep on Groovying!