Шаблон для блокировки пользователя Java Swing в рабочем потоке - PullRequest
6 голосов
/ 24 марта 2011

Как известно большинству Java-программистов, обновления графического интерфейса Swing должны выполняться только в потоке диспетчеризации событий AWT, и рекомендуется, чтобы долго выполняющиеся процессы выполнялись в «рабочем» потоке, а обновления отправлялись в поток диспетчеризации событий с использованием SwingUtilities.invokeAndWait() или SwingUtilities.invokeLater().

Как вы не позволяете пользователю продолжить работу с приложением, пока завершается длительный процесс? Вы выделяете серые элементы управления, а затем разрешаете рабочему потоку повторно включать их с помощью вызовов SwingUtilities, упомянутых выше?

Есть ли лучший альтернативный шаблон?

Ответы [ 3 ]

3 голосов
/ 24 марта 2011

Я бы рассмотрел 3 решения:

  • отключить компоненты панели : это вообще то, что я делаю. К сожалению, Swing не предоставляет простой способ отключения панели и всех ее дочерних элементов, но рекурсию легко выполнить (см. этот другой SO-ответ ). Другая проблема заключается в том, что некоторые компоненты Swing выглядят одинаково при включении и отключении (например, JList)
  • скрыть панель с помощью CardLayout : на панели с CardLayout добавьте 2 компонента. Первая - это панель, на которой размещены компоненты для деактивации, а вторая - панель с сообщением «загрузка» или «пожалуйста, подождите». Простой JLabel в Gridbaglayout делает свое дело. Затем вам просто нужно переключиться с одного на другой. Я использую эту технику для мест, где должен отображаться результат вычисления / запроса.
  • поместите какой-то компонент поверх панели, который потребляет события мыши : вы можете сделать это самостоятельно с помощью LayeredPane, или вы можете использовать специальную утилиту. JXLayer может сделать это (я читал, что JXLayer будет включен в Java 7, так что это может стать «стандартным» решением этой проблемы).
2 голосов
/ 24 марта 2011

Существует несколько способов, выбор которых в основном зависит от дизайна и компоновки вашего графического интерфейса.

  • Использование индикатора выполнения - замена панели или областичто вы не хотите, чтобы пользователь касался индикатором выполнения.Это избавит вас от необходимости иметь дело с событиями, которые вам пока не нужны, и в то же время покажет пользователю, что что-то происходит в фоновом режиме.
  • Отключите кнопки и добавьте курсор ожидания - Используйте setEnable (false) во время работы и, возможно, измените курсор на курсор ожидания.Это снова дает понять, что опция еще не доступна только для временного периода.
  • Не отвечать на события и не выбрасывать GlassPane - Это менее дружественный пользователь, так какзаставляет приложение выглядеть не отвечающим, однако в некоторых ситуациях оно может быть приемлемым.
0 голосов
/ 24 марта 2011

Один из способов сделать это - использовать Jframe.setGlassPane () и установить компонент, который использует все события. Вы также можете проявить творческий подход и использовать в своем стекле флеш-изображение с вращающимся ожиданием. Но учтите, что установка стеклянной панели может быть не такой, как вы хотите. Для более сложных требований вам, возможно, придется поиграться с очередями событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...