Когда мы разрабатываем приложения Swing, SwingWorker очень помогает. Но есть большой недостаток в использовании этого класса. если вы не вызовете get () в методе done, вы потеряете все исключения, которые выдает вычисление в doInBackground (). И ваши действия могут остановиться, и вы никогда не поймете, почему. В 95% моих действий с использованием SwingWorker doInBackground () ничего не возвращает.
Джонатан Джайлс представил в своем блоге хорошее решение для устранения этого исключения проглатывания. Со своей стороны, я часто что-то делал в EDT перед запуском doInBackground (), поэтому я внес изменения в код, представленный Джонатаном, и он дал мне тот простой класс, который я нашел лучше, чем SwingWorker:
public abstract class BetterSwingWorker { private final SwingWorker<Void, Void> worker = new SimpleSwingWorker(); public void execute() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { before(); } }); worker.execute(); } protected void before() { //Nothing by default } protected abstract void doInBackground() throws Exception; protected abstract void done(); private class SimpleSwingWorker extends SwingWorker<Void, Void> { @Override protected Void doInBackground() throws Exception { BetterSwingWorker.this.doInBackground(); return null; } @Override protected void done() { try { get(); } catch (final InterruptedException ex) { throw new RuntimeException(ex); } catch (final ExecutionException ex) { throw new RuntimeException(ex.getCause()); } BetterSwingWorker.this.done(); } } }
Вы можете использовать в качестве SwingWorker по умолчанию. Вы должны реализовать методы doInBackground () и done (), и вы можете, только если хотите, переопределить метод before (), который вызывается в EDT в начале процесса. И затем вы можете запустить SwingWorker с помощью execute ().
Я надеюсь, что этот маленький класс может быть полезным для кого-то.
Источник для не глотающего качателя.
С http://www.baptiste-wicht.com/2010/09/a-better-swingworker/