Требуется дизайнерское предложение: включение пункта меню из-за пределов JFrame

Мое 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...


person Volker L    schedule 14.08.2014    source источник


Ответы (1)


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

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


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

person Holger    schedule 14.08.2014
comment
Да, второй подход приводит к лучшему дизайнерскому решению. Это решило проблему с противоположной стороны: вместо графического интерфейса изменения потока --› пусть GUI будет SwingWorker... - person Volker L; 18.08.2014