Как указать, что JComboBox загружает значения?

У меня есть JComboBox, чьи значения извлекаются через сеть.

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

Основные требования включают в себя:

  1. Раскрывающийся список JComboBox не должен блокировать EDT, но действие комбо не должно работать, пока не появятся значения.
  2. Пользователь должен знать, когда все данные были получены.
  3. Размер (пользовательский интерфейс) индикатора должен быть как можно меньше.

Обратите внимание, что данные не извлекаются до тех пор, пока пользователь не захочет увидеть значения комбо (т.е. не развернет раскрывающийся список).

Решение, которое я использовал:

Я использовал SwingWorker держать интерфейс отзывчивым. Поле со списком было наложено с использованием JIDE Overlayable с JIDE InfiniteProgressPanel что слушает работника.

3 ответа

Решение

Чтобы избежать блокировки EDT, ваш поиск данных должен выполняться в фоновом потоке. Я бы использовал SwingWorker для поиска и загрузки значений, так как это делает фоновый поток с другими вкусностями, которые делают его очень удобным для Swing. Я бы сделал JComboBox включен свойство false пока все значения не будут загружены, а затем включите его через setEnabled(true), Вы будете знать, что SwingWorker выполняется либо через его done() метод (переопределив его), или добавив PropertyChangeListener в SwingWorker и получив уведомление, когда его состояние SwingWorker.StateValue.DONE,

Один из способов узнать, что процесс завершен, состоит в том, что он увидит, когда поле со списком будет повторно включено. Если вам нужен более очевидный индикатор, вы можете отобразить JProgressBar или ProgressMonitor. Это может отображаться в диалоговом окне, если вы хотите оставить внешний вид графического интерфейса в основном без изменений.

Я реализовал это, добавив элемент "Загрузка..." и специальную рамку вокруг JComboBox. При нажатии на отдельную ветку начинается добавление новых элементов через SwingUtilities.invokeAndWait. По завершении загрузки последний элемент "Загрузка..." удаляется.

Чтобы не заставлять моих пользователей ждать загрузки данных, объедините ответы по угрям и стану:-)

  • начните с модели, содержащей ноль или одно действительное значение плюс фиктивная запись "загрузка"
  • зарегистрируйте PopupMenuListener и запустите SwingWorker, загружающий данные (в отдельную структуру данных, может быть новой моделью) в самом первом меню WillBecomeVisible
  • во время загрузки выберите фиктивную запись (и / или что-либо еще подходящее для информирования пользователя о том, что происходит), действие также должно быть осведомлено о "ничего не делать" еще
  • слушать работника, при получении ГОТОВО заменить / заполнить данные в модели комбо
Другие вопросы по тегам