Как указать, что JComboBox загружает значения? - PullRequest
6 голосов
/ 26 декабря 2011

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

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

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

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 26 декабря 2011

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

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

3 голосов
/ 27 декабря 2011

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

1 голос
/ 27 декабря 2011

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

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