0

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

public static void dropHPBar(int before, int after) { 

    Thread.currentThread.sleep(50); 

    while (before > after) { 

     try { 
      Thread.sleep(50); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     GameMain.gW.setHP(before); 

     b --; 
    } 

и от GameMain.gW:

public void setHP(int x) { 

    hpBar.setValue(x); 
} 

Почему индикатор не заметно обновляется?

ответ

3

Вызов Thread.sleep в EDT (рассылка событий) предотвращает обновление пользовательского интерфейса. Для того чтобы архивировать concurrency, вам необходимо использовать Swing Worker.

С сайта Oracle:

Свинг состоит из трех видов нитей:

  • Initial нитей, нитей, которые выполняют исходный код приложения.

  • Тема отправки событий, в которой выполняется весь код обработки событий. Большинство кода, который взаимодействует с каркасом Swing, также должны выполнить в этой ветке.

  • Рабочие потоки, также известные как фоновые потоки, где выполняются трудоемкие фоновые задачи.

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