Каково объяснение SwingWorker?

Объявление вашего метода конфликтует с System.Drawing.Image и System.Web.UI.Controls. Используйте это как

public string ImageToBase64(System.Drawing.Image image,System.Drawing.Imaging.ImageFormat format)
6
задан OscarRyz 11 November 2008 в 19:10
поделиться

7 ответов

Да, можно выполнить то, что SwingWorker делает с ванильными потоками + invokeLater. SwingWorker обеспечивает предсказуемый, интегрированный способ выполнить задачи на фоновом потоке и результат отчета на EDT. SwingWorker дополнительно добавляет поддержку промежуточных результатов. Снова, можно сделать все это сами, но иногда это просто в использовании интегрированное и предсказуемое решение особенно когда дело доходит до параллелизма.

10
ответ дан 8 December 2019 в 13:50
поделиться

Пример кода:

import org.jdesktop.swingx.util.SwingWorker; // This one is from swingx
                                             // another one is built in 
                                             // since JDK 1.6 AFAIK?

public class SwingWorkerTest {

  public static void main( String[] args ) {

    /**
      * First method
      */
    new Thread() {

      public void run() {

        /** Do work that would freeze GUI here */

        final Object result = new Object();
        java.awt.EventQueue.invokeLater( new Runnable() {

          public void run() {
          /** Update GUI here */
          }
        } );

      }
    }.start();

    /**
      * Second method
      */
    new SwingWorker< Object , Object >() {

      protected Object doInBackground() throws Exception {
        /** Do work that would freeze GUI here */

        return null;
      }

      protected void done() {
        try {
          Object result = get();
          /** Update GUI here */
        }
        catch ( Exception ex ) {
          ex.printStackTrace();
          if ( ex instanceof java.lang.InterruptedException )
            return;
        }
      }
    }.execute();
  }

}

Выбор всегда зависит от персонального предпочтения и варианта использования.

Второй метод имеет преимущество при рефакторинге. Можно более легко преобразовать анонимный класс во внутренний класс, когда метод, в котором он используется, является слишком большим.

Мое персональное предпочтение переходит к второму, поскольку мы создали платформу, где SwingWorkers могут быть добавлены и выполняются один за другим...

3
ответ дан 8 December 2019 в 13:50
поделиться

для ответа на вопрос Вы ничего не пропускаете. этот класс является просто удобной утилитой для оборачивания функциональности, которую Вы описали (запустите другой поток, чтобы сделать фоновую работу и затем вызывающий некоторое окончательное решение на EDT с результатами).

1
ответ дан 8 December 2019 в 13:50
поделиться

SwingWorker является реализацией общего шаблона (в .NET, который я считал существует GuiWorker BackgroundWorker для этого), где необходимо сделать некоторую работу в программе GUI, но сохранить GUI быстро реагирующим. Проблема состоит в том, что часто библиотеки GUI не много ориентированный на многопотоковое исполнение, таким образом, распространенный способ реализовать таких рабочих состоит в том, чтобы использовать цикл сообщения библиотеки для передачи сообщений в цикл событий приложения.

Эти классы позволяют Вам легко обновлять свой GUI. Обычно, у них есть a update(int status) метод, который называет поток, диспетчеризированный классом, и обработал GUI, в то время как поток продолжает свою работу.

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

2
ответ дан 8 December 2019 в 13:50
поделиться

SwingWorker делает тривиальный пример кода намного более кратким. Однако это создает комок грязи. Связь к и от GUI и выполняемой логики все сварена вместе. Так, я не хотел бы видеть, что это использовало в реальном производственном коде.

0
ответ дан 8 December 2019 в 13:50
поделиться

SwingWorker намного легче, чем унавоживание с Вашими собственными потоками, потому что он дает Вам две вещи, которые являются болезненными к вручную, распараллеливают координацию между UI и фоновым процессом и выполнением эффективных циклов, фоновая работа, которая удерживает на месте рабочие и передающие обновления UI инкрементно, как процесс большой объем данных или загрузка большого списка. Недостаток (или преимущество) зависит от того, как Вы смотрите на него, то, что это скрывает конкретную реализацию, таким образом, будущая версия может иметь другое поведение, производительность, и т.д., который может быть нежелательным. Я нашел это довольно полезным, поскольку связующее звено между событием UI и моим собственным кодом команды, SwingWorker поддерживает ссылку на UI, и мой код качает данные.

0
ответ дан 8 December 2019 в 13:50
поделиться

При работе со Swing важно знать, что основная обработка свинга (т. Е. Рендеринг) происходит в одном потоке (который не является вашим основным потоком). Это часто называют потоком событий Swing или awt. Те, кто знаком с JDK до 1.6, помнят ошибку «серый прямоугольник», если вы потратили слишком много времени на диспетчер событий для компонента Swing. Что это значит. В любом приложении Swing у вас будет 2 запущенных потока, с которыми вам теперь придется иметь дело. Обычно, если все ваши операции в диспетчере событий (код, который запускается, скажем, при нажатии кнопки) короткие (т. Е. Изменение состояния кнопки siwng), вы можете просто запустить это в диспетчере событий. Если ваше приложение будет вызывать веб-службу или базу данных, или состояние вашего приложения определяется внешними событиями (т.е. jms) или вы хотите просто сделать свой пользовательский интерфейс более интерактивным (т. е. создать список элементов и иметь возможность делать что-то еще), вам следует использовать поток, отличный от потока событий awt (основной поток событий Swing). Таким образом, в этих случаях вы создаете новый поток и делаете то, что должны, а когда результаты, наконец, возвращаются, вам нужно каким-то образом создать событие, которое может быть выполнено диспетчером awt / swing. SwingWorker - отличный небольшой шаблон проектирования, который позволяет вам это делать (другой способ - SwingUtilities). Это особенно полезно для получения данных из внешних источников или, скажем, длительных вычислений (рендеринга графической сцены). Это помогает автоматизировать отправку и последующую повторную интеграцию результатов из внешнего потока (кроме потока awt). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).

создать список элементов и иметь возможность делать что-то еще), вы должны использовать поток, отличный от потока событий awt (основной поток событий). Таким образом, в этих случаях вы создаете новый поток и делаете то, что должны, а когда результаты, наконец, возвращаются, вам нужно каким-то образом создать событие, которое может быть выполнено диспетчером awt / swing. SwingWorker - отличный небольшой шаблон проектирования, который позволяет вам это делать (другой способ - SwingUtilities). Это особенно полезно для получения данных из внешних источников или, скажем, длительных вычислений (рендеринга графической сцены). Это помогает автоматизировать отправку и последующую повторную интеграцию результатов из внешнего потока (кроме потока awt). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).

создать список элементов и иметь возможность делать что-то еще), вы должны использовать поток, отличный от потока событий awt (основной поток событий). Таким образом, в этих случаях вы создаете новый поток и делаете то, что должны, а когда результаты, наконец, возвращаются, вам нужно каким-то образом создать событие, которое может быть выполнено диспетчером awt / swing. SwingWorker - отличный небольшой шаблон проектирования, который позволяет вам это делать (другой способ - SwingUtilities). Это особенно полезно для получения данных из внешних источников или, скажем, длительных вычислений (рендеринга графической сцены). Это помогает автоматизировать отправку и последующую повторную интеграцию результатов из внешнего потока (кроме потока awt). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).

Таким образом, в этих случаях вы создаете новый поток и делаете то, что должны, а когда результаты, наконец, возвращаются, вам нужно каким-то образом создать событие, которое может быть выполнено диспетчером awt / swing. SwingWorker - отличный небольшой шаблон проектирования, который позволяет вам это делать (другой способ - SwingUtilities). Это особенно полезно для получения данных из внешних источников или, скажем, длительных вычислений (рендеринга графической сцены). Это помогает автоматизировать отправку и последующую повторную интеграцию результатов из внешнего потока (кроме потока awt). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).

Таким образом, в этих случаях вы создаете новый поток и делаете то, что должны, а когда результаты, наконец, возвращаются, вам нужно каким-то образом создать событие, которое может быть выполнено диспетчером awt / swing. SwingWorker - отличный небольшой шаблон проектирования, который позволяет вам это делать (другой способ - SwingUtilities). Это особенно полезно для получения данных из внешних источников или, скажем, длительных вычислений (рендеринга графической сцены). Это помогает автоматизировать отправку и последующую повторную интеграцию результатов из внешнего потока (кроме потока awt). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).

SwingWorker - отличный небольшой шаблон проектирования, который позволяет вам это делать (другой способ - SwingUtilities). Это особенно полезно для получения данных из внешних источников или, скажем, длительных вычислений (рендеринга графической сцены). Это помогает автоматизировать отправку и последующую повторную интеграцию результатов из внешнего потока (кроме потока awt). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).

SwingWorker - отличный небольшой шаблон проектирования, который позволяет вам это делать (другой способ - SwingUtilities). Это особенно полезно для получения данных из внешних источников или, скажем, длительных вычислений (рендеринга графической сцены). Это помогает автоматизировать отправку и последующую повторную интеграцию результатов из внешнего потока (кроме потока awt). Для асинхронных событий (т. Е. Событие из JMS должно обновить результат, используйте SwingUtilities).

1
ответ дан 8 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: