Как отобразить сообщение «Загрузка ...», которое автоматически закрывается после завершения обработки (аналогично индикатору выполнения)? - PullRequest
1 голос
/ 19 мая 2011

У меня есть comboBox jComboBox1, который содержит названия всех стран в мире ... При выборе одной из стран второй комбинированный ящик jComboBox2 заполняется всеми состояниями в стране, выбранной в jComboBox1. Теперь я хочу отобразить индикатор выполнения или сообщение «Идет загрузка ...», когда состояния в выбранной стране заполняются и автоматически закрываются по завершении.

Код такой ...

 public void actionPerformed(ActionEvent e){
    if(e.getSource()==jComboBox1){
            if(jCombobox1.setSelectedIndex()!=-1){
                   Country country=new Country();
                   country.populateStates(jComboBox2,label,this);
                  //"label" is of type JLabel whose text is is set to show the progress
                  //"this" refers to the current frame to repaint once label is changed
            }
    }
 }

Я подумал, что могу использовать JLabel во фрейме, видимость и текст которого можно установить с помощью setVisible () и setText. Обратите внимание, что «Страна» - это другой класс, и я передаю эту метку его методу populateStates, где я использую label.setText («Загрузка сведений о состоянии:» + состояние) и делаю frame.repaint (). (Вот почему я передаю объект кадра «это»). Даже тогда метка не меняется.

Но единственное изменение, которое появляется в исходном тексте метки после выбора страны, - это последний текст, на который она установлена ​​после завершения выбора страны. Промежуточные изменения в метке не отображаются в графическом интерфейсе. Почему это происходит и что не так с моим подходом? Должен ли я использовать другой подход с использованием потоков ??? Если да, то как?

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Прежде всего, так как это кажется долгой задачей, вам необходимо заполнить список государств страны ВНЕ EDT.

Для этого вы можете использовать SwingWorker,SwingWorker предоставляет некоторые методы, которые можно использовать для обратной связи с пользователем.

Но у вас будет некоторая работа для отображения этой обратной связи.

2 голосов
/ 21 мая 2011

Я должен использовать get() для получения значения, но get() останавливает все обновления графического интерфейса.

Да, "вызов get() вкл. Поток отправки событий блокирует обработку всех событий, включая перерисовки, до завершения SwingWorker. "Вместо этого publish() приводит к накоплению и process() к EDT.См. Примеры здесь и здесь .

Приложение: API get() показывает пример использования модального диалога в этом контексте.Ваш PropertyChangeListener может обновить JProgressBar в диалоговом окне.

...