события сброса / прерывания событий очереди событий Java - PullRequest
3 голосов
/ 20 мая 2011

У меня есть вопрос, связанный с дизайном, на который я пытаюсь найти ответ.

Вот сценарий.

Предположим, что вы хотите сделать что-то дорогое (трудоемкое) в результате ввода данных пользователем (например, загрузка огромных объемов данных из некоторой базы данных, чтение больших файлов). Настоятельно рекомендуется выполнять трудоемкую работу в отдельном потоке и никогда не блокировать EDT, иначе графический интерфейс перестанет отвечать на запросы.

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

Это то, что я делаю, чтобы справиться с таким сценарием.

Шаг 1: Прежде чем я собираюсь начать длительную операцию.

  1. Изменить курсор на занятый курсор.
  2. Добавьте слушателей мыши на стеклянную панель рамки верхнего уровня компонента.
  3. Сделать стекло видимым, чтобы оно могло принимать события мыши. Стекло ничего не делает в результате ввода мышью.

Шаг 2: Выполнить трудоемкую операцию в фоновом потоке. Фоновый поток имеет блок finally, который уведомляет поток событий о завершении работы (завершенной или прерванной из-за ошибки).

Шаг 3:

  1. Переключить курсор мыши в нормальное состояние.
  2. Удалить слушателей со стеклянной панели.
  3. Сделать стеклянную панель невидимой, чтобы события мыши передавались их предполагаемым получателям.

Это правильный подход к таким ситуациям?

Что вы, ребята, рекомендуете?

1 Ответ

5 голосов
/ 20 мая 2011

SwingWorker может использоваться в этом контексте.Связанные элементы управления можно отключить, когда фоновая задача запущена и повторно включена в done().В этом связанном примере кнопка run предназначена для переключения между «Выполнить» и «Отмена».

Добавление: здесь имеется обратный порт для Java 1.5 здесь.

...