Статьи

Swing Tip: лучший SwingWorker без глотания исключений

Когда мы разрабатываем приложения 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/