Мое приложение Java в основном живет в объекте JFrame. В его меню «Файл» есть 2 пункта: «Открыть» и «Закрыть». Пункт меню «Закрыть» отключен. Он будет включен с помощью fileOpenActionPerformed после завершения синтаксического анализа файла:

private void fileOpenActionPerformed(java.awt.event.ActionEvent evt) {
   // (1) get file from JFileChooser
   // (2) parse Contents
   if(bContentsValid == true) {
      this.fileClose.setEnabled(true);
   }

Поскольку синтаксический анализ занимает довольно много времени, я хотел бы выделить его в отдельный поток. После завершения поток должен включить пункт меню «Закрыть».

Передача ссылки на JMenuItem кажется мне довольно плохим дизайном. Есть предложения по дизайну?

NB: Я подумал об использовании объекта-оболочки, содержащего как JFrame, так и ссылку на поток, но это нарушает большую часть кода, созданного IDE NetBeans ...

0
Volker L 14 Авг 2014 в 20:32

1 ответ

Лучший ответ

Инкапсулируйте действие по завершении в Runnable и передайте это Runnable фоновому потоку.

Это пригодится, поскольку для правильной реализации ваш фоновый поток должен запланировать манипуляции с пользовательским интерфейсом через EventQueue.invokeLater или SwingUtilities.invokeLater, вам все равно понадобится Runnable.


В качестве альтернативы вы можете реализовать всю фоновую активность с помощью SwingWorker. Затем вы можете переопределить метод done() и включить в него пункт меню.

2
Holger 14 Авг 2014 в 20:36
Да, второй подход приводит к лучшему дизайнерскому решению. Он решил проблему с противоположной стороны: вместо изменения потока GUI -> пусть GUI имеет SwingWorker ...
 – 
Volker L
18 Авг 2014 в 22:17