Jump to content

SwingWorker

SwingWorker — это служебный класс , разработанный Sun Microsystems для Swing библиотеки языка программирования Java . SwingWorker обеспечивает правильное использование потока диспетчеризации событий . Начиная с Java 6 , SwingWorker включен в JRE . [ 1 ]

Несколько несовместимых неофициальных версий SwingWorker были выпущены с 1998 по 2006 год, и необходимо проявлять осторожность, чтобы избежать обильной документации по этим версиям, предшествующей Java 6.

Использование в Java 6.0

[ редактировать ]

Проблема с потоком диспетчеризации событий

[ редактировать ]

SwingWorker полезен, когда после события взаимодействия с пользователем необходимо выполнить трудоемкую задачу (например, анализ огромного XML-файла при нажатии JButton). Самый простой способ сделать это:

private Document doc;
...
JButton button = new JButton("Open XML");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        doc = loadXML();
    }
});

Это сработает, но, к сожалению, loadXML() метод будет вызываться в том же потоке , что и основной поток Swing ( поток диспетчеризации событий ), поэтому, если методу требуется время для выполнения, графический интерфейс на это время зависает.

Решение SwingWorker

[ редактировать ]

Эта проблема характерна не только для Java, но характерна для многих моделей с графическим интерфейсом . SwingWorker предлагает способ решения этой проблемы, выполняя трудоемкую задачу в другом фоновом потоке, сохраняя графического интерфейса в это время отзывчивость .

Создание работника

[ редактировать ]

Следующий код определяет SwingWorker, который инкапсулирует loadXML() вызов метода:

SwingWorker worker = new SwingWorker<Document, Void>() {
    @Override
    public Document doInBackground() {
        Document intDoc = loadXML();
        return intDoc;
    }
};

Исполнение рабочего

[ редактировать ]

Выполнение начинается с помощью SwingWorker.execute() метод.

Получение результата

[ редактировать ]

Результат можно получить с помощью SwingWorker.get() метод.

Как звоню get() в потоке диспетчеризации событий блокирует обработку всех событий, включая перерисовки, до завершения задачи, поэтому следует избегать его вызова до завершения длительной операции. Получить результат после завершения задачи можно двумя способами:

private Document doc;
...
SwingWorker<Document, Void> worker = new SwingWorker<Document, Void>() {
    @Override
    public Document doInBackground() {
        Document intDoc = loadXML();
        return intDoc;
    }
    @Override
    public void done() {
        try {
            doc = get();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }
    }
}

Полный пример работника

[ редактировать ]
private Document doc;
...
JButton button = new JButton("Open XML");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        SwingWorker<Document, Void> worker 
            = new SwingWorker<Document, Void>() {

            @Override
            public Document doInBackground() {
                Document intDoc = loadXML();
                return intDoc;
            }
            @Override
            public void done() {
                try {
                    doc = get();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                } catch (ExecutionException ex) {
                    ex.printStackTrace();
                }
            }
        };
        worker.execute();
    }
});

История: использование до Java 6.0.

[ редактировать ]

SwingWorker является частью Java SE только начиная с Java 6.0. Sun выпустила версии для использования с более ранними JDK, хотя это были неофициальные версии, которые не входили в состав Java SE и не упоминались в документации стандартной библиотеки. [ 2 ] Самая последняя из этих версий датируется 2003 годом и часто называется SwingWorker версии 3. [ 3 ] К сожалению, JDK 6.0 SwingWorker и SwingWorker версии 3 используют разные имена методов и несовместимы. Версия Backport (см. ниже) теперь рекомендуется для использования до Java 6.

Пример создания экземпляра SwingWorker 3 показан ниже:

SwingWorker worker = new SwingWorker() {
    public Object construct() {
        ... //add the code for the background thread
    }
    public void finished() {
        ... //code that you add here will run in the UI thread
    } 
};
worker.start();  //Start the background thread

The start() Метод выполняет код, добавленный в методstruct(), в отдельном потоке. Чтобы получить предупреждение о завершении фонового потока, достаточно переопределить finished() метод. construct() метод может возвращать результат, который позже можно будет получить с помощью метода SwingWorker. get() метод.

Резервное копирование Java 6 SwingWorker

[ редактировать ]

Резервная копия SwingWorker из Java 6 в Java 5 доступна по адресу http://swingworker.java.net/. [ постоянная мертвая ссылка ] . Помимо имени пакета ( org.jdesktop.swingworker ), он совместим с Java 6 SwingWorker.

Эквиваленты

[ редактировать ]
  1. ^ SwingWorker
  2. ^ См . javax.swing сводка пакета до и после J2SE 6.0. Также обратите внимание, что класс SwingWorker не указан на индексных страницах документации до версии 6.0: [1] , [2] .
  3. ^ Вы можете скачать его. «Свингворкер 3» . Интернет-архив. Архивировано из оригинала 26 июня 2012 года.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 04c4857065a87e709644e6cbbfa04d90__1710185160
URL1:https://arc.ask3.ru/arc/aa/04/90/04c4857065a87e709644e6cbbfa04d90.html
Заголовок, (Title) документа по адресу, URL1:
SwingWorker - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)