У меня есть вопрос, связанный с дизайном, на который я пытаюсь найти ответ.
Вот сценарий.
Предположим, что вы хотите сделать что-то дорогое (трудоемкое) в результате ввода данных пользователем (например, загрузка огромных объемов данных из некоторой базы данных, чтение больших файлов). Настоятельно рекомендуется выполнять трудоемкую работу в отдельном потоке и никогда не блокировать EDT, иначе графический интерфейс перестанет отвечать на запросы.
Однако существуют сценарии, когда вы не должны предоставлять входные данные для графического интерфейса, если фоновая задача не завершена. В моем конкретном случае, только после того, как фоновая работа закончена, я могу определить, какие элементы графического интерфейса должны быть видны и включены / отключены. Только те элементы графического интерфейса, которые должны быть видны и включены, должны реагировать на пользовательские вводы, в противном случае поведение может быть непредсказуемым в моем конкретном случае.
Это то, что я делаю, чтобы справиться с таким сценарием.
Шаг 1: Прежде чем я собираюсь начать длительную операцию.
- Изменить курсор на занятый курсор.
- Добавьте слушателей мыши на стеклянную панель рамки верхнего уровня компонента.
- Сделать стекло видимым, чтобы оно могло принимать события мыши. Стекло ничего не делает в результате ввода мышью.
Шаг 2: Выполнить трудоемкую операцию в фоновом потоке. Фоновый поток имеет блок finally, который уведомляет поток событий о завершении работы (завершенной или прерванной из-за ошибки).
Шаг 3:
- Переключить курсор мыши в нормальное состояние.
- Удалить слушателей со стеклянной панели.
- Сделать стеклянную панель невидимой, чтобы события мыши передавались их предполагаемым получателям.
Это правильный подход к таким ситуациям?
Что вы, ребята, рекомендуете?