Как использовать SwingWorker в Java?

Связано с моим предыдущим вопросом: переименовать вызов из другого classа на Java?

Я новичок в Java, и я ознакомился с некоторыми учебниками по SwingWorker. Тем не менее, я не уверен, как реализовать его с примером кода, который я дал в предыдущем вопросе.

Может кто-нибудь объяснить, как использовать SwingWorker в отношении моего fragmentа кода и / или указать мне на достойный учебник? Я посмотрел, но я не уверен, что понимаю.

Как правило, SwingWorker используется для выполнения длительных задач в Swing.

Выполнение долговременных задач в streamе отправки событий (EDT) может привести к блокировке GUI, поэтому одна из вещей, которые были сделаны, – это использовать SwingUtilities.invokeLater и invokeAndWait который поддерживает графический интерфейс, который определяет приоритетность других событий AWT до выполнение требуемой задачи (в виде Runnable ).

Однако проблема с SwingUtilities заключается в том, что она не позволяла возвращать данные из исполняемого Runnable в исходный метод. Это то, к чему SwingWorker .

В учебнике Java есть раздел о SwingWorker .

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

Во-первых, будет выпущен class, расширяющий SwingWorker :

 class AnswerWorker extends SwingWorker { protected Integer doInBackground() throws Exception { // Do a time-consuming task. Thread.sleep(1000); return 42; } protected void done() { try { JOptionPane.showMessageDialog(f, get()); } catch (Exception e) { e.printStackTrace(); } } } 

Тип возвращаемого метода doInBackground и get определяется как первый тип SwingWorker , а второй тип – тип, используемый для возврата для методов publish и process , которые не используются в этом примере.

Затем, чтобы вызвать SwingWorker , вызывается метод execute . В этом примере мы подключим ActionListener к JButton для выполнения AnswerWorker :

 JButton b = new JButton("Answer!"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new AnswerWorker().execute(); } }); 

Вышеупомянутая кнопка может быть добавлена ​​в JFrame и нажимается, чтобы получить окно сообщения через секунду. Для инициализации GUI для приложения Swing можно использовать следующие:

 private void makeGUI() { final JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().setLayout(new FlowLayout()); // include: "class AnswerWorker" code here. // include: "JButton" b code here. f.getContentPane().add(b); f.getContentPane().add(new JButton("Nothing")); f.pack(); f.setVisible(true); } 

После запуска приложения будут две кнопки. Один помечен как «Ответ!». и другое «Ничто». Когда вы нажимаете «Ответ!» , сначала ничего не произойдет, но нажатие кнопки «Ничто» будет работать и продемонстрировать, что графический интерфейс является отзывчивым.

И, через секунду, результат AnswerWorker будет AnswerWorker в окне сообщения.

Согласен:

Запуск долговременных задач в streamе отправки событий (EDT) может привести к блокировке GUI.

Не согласен:

поэтому одна из вещей, которые были сделаны, – это использовать SwingUtilities.invokeLater и invokeAndWait, который поддерживает графический интерфейс.

invokeLater по-прежнему запускает код на EDT и может заморозить ваш интерфейс! Попробуй это:

 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } } }); 

По крайней мере, я не могу перемещать мышь, как только я нажимаю кнопку, которая запускает actionPerformed с вышеуказанным кодом. Я что-то упускаю?

  • SwingWorker не обновляет JProgressBar без Thread.sleep () в пользовательской диалоговой панели
  • Невозможно обновить JProgressBar из classа SwingWorker
  • Может ли индикатор выполнения работать в classе за пределами основного?
  • Не удается получить ArrayIndexOutOfBoundsException из будущего И SwingWorker, если stream запущен. Исполнитель
  • Несколько графиков на нескольких фигурах с использованием jFreeChart
  • Проблемы с добавлением JTextArea
  • Ядро Java swingWorker работает, но не получено или передано сообщение
  • Ожидание нескольких SwingWorkers
  • SwingWorker в Java
  • Как обмениваться данными с двумя (2) classами SwingWorker в Java
  • Как использовать SwingWorker?
  • Давайте будем гением компьютера.