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

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

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

К основным требованиям относятся:

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

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

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

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


person Asaf    schedule 26.12.2011    source источник


Ответы (3)


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

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

person Hovercraft Full Of Eels    schedule 26.12.2011
comment
Спасибо! я отредактировал вопрос - значения должны быть заполнены только по запросу, поэтому включение / отключение - это не то, что я ищу. Диалог тоже не подходит. Что касается SwingWorker - я буду использовать один, но вопрос в том, какой пользовательский интерфейс с ним управлять - person Asaf; 26.12.2011
comment
заполняется только по запросу? запросил как? - person trashgod; 26.12.2011
comment
@trashgod, когда раскрывающийся список открывается в первый раз - person Asaf; 27.12.2011

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

person StanislavL    schedule 27.12.2011
comment
Это в строках того, что я думал. Что вы делаете, чтобы не выбрать «Загрузка...» или не запустить еще один отдельный поток? - person Asaf; 27.12.2011
comment
Не запрещайте выбирать Загрузка... просто ничего не делайте. Если комбинация закрыта после ее выбора, при загрузке данных, Загрузка... будет заменена первой опцией или пуста. Исчезнет и специальная граница. Вы должны убедиться, что вы не загружаете данные, чтобы не загружать их дважды. - person helios; 27.12.2011

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

  • начните с модели, содержащей ноль или одно реальное значение плюс фиктивная запись «загрузка»
  • зарегистрируйте PopupMenuListener и запустите SwingWorker, загружающий данные (в отдельную структуру данных, может быть новая модель) в своем самом первом менюWillBecomeVisible
  • во время загрузки выберите фиктивную запись (и / или что-либо еще, что подходит для информирования пользователя о том, что происходит), действие также должно знать о «пока ничего не делать»
  • слушайте воркера, при получении DONE замените/залейте данные в модель комбо
person kleopatra    schedule 27.12.2011