Как отобразить сообщение о загрузке, которое автоматически закрывается по завершении обработки (аналогично индикатору выполнения)?

У меня есть поле со списком 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(). (Вот почему я передаю объект кадра «это»). Даже в этом случае этикетка не меняется.

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


person Niranjani S    schedule 19.05.2011    source источник


Ответы (2)



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

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

Но вам придется выполнить некоторую работу, чтобы отобразить эту обратную связь.

person jfpoilpret    schedule 19.05.2011
comment
можете ли вы привести пример кода с использованием SwingWorker или связанных указателей - person Niranjani S; 20.05.2011
comment
Примеры можно найти здесь и здесь. - person trashgod; 20.05.2011
comment
@trashgod Я реализовал класс, расширяющий класс Swingworker, с помощью doInBackground, который возвращает некоторые обработанные данные. Для этого я должен использовать get() для получения значения. Но get() останавливает все обновления графического интерфейса. Если я удалю вызов get() и использую execute(), графический интерфейс (текст метки) покажет изменения. Как получить возвращаемое значение при одновременном обновлении графического интерфейса?? - person Niranjani S; 21.05.2011
comment
Ниранджани С.: Я подробно изложил в соседнем ответить. - person trashgod; 21.05.2011