SwingWorker makes your life easier by linking the process to the GUI update in one place then doing all the complex thread-related stuff for you. But that also means it's a fair criticism to say that this one place violates the separation of GUI and model. That makes me uneasy too, but I guess that's a personal preference.
In my code I prefer to use Observer so there is no knowledge of the GUI in the model itself. I'm a bit of a purist like that. Here is some relevant reading (!)
http://www.vogella.com/articles/DesignPatternObserver/article.html
In its very simplest form you add something like this to your process class
private ChangeListener listener = null;
public void addChangeListener(ChangeListener listener) {
// just supports one listener to keep this really simple
this.listener = listener;
}
void notifyChangeListener() {
// call this whenever data is changed
if (listener != null)
listener.stateChanged(new ChangeEvent(this));
}
}
Then in the GUI somewhere you implement the ChangeListener interface (ie the public stateChanged method) and add the GUI instance to the process instance by calling its addChangeListener(this); Now whenever something interesting happens in the process you call notifyChangeListener, and the GUI's stateChanged method can update the GUI.