Что мешает обновлению моего индикатора выполнения?
Я пишу небольшую функцию, которая обновит мой ProgressBar и базу JLabel для взвешенных случайных целых чисел. Поток спит правильно, и через него приходят случайные значения, однако мой индикатор выполнения и jlabel не обновляются.
Это также оставляет мой графический интерфейс безразличным. Он не блокирует мой графический интерфейс полностью (я могу нажимать кнопки, но он не выполняет функции, связанные с этими кнопками).
Создание оператора print в методе run() не распечатывается. Так что я думаю, что это никогда не попадет туда.
Вот мой метод до сих пор:
private void updateProgressBar(int max) {
final int maxDiamonds = max;
int i = 0;
while(i <= max) {
//get random obstacle found
final Obstacle o = obstacle.next();
System.out.println("Obstacle: " + o.getName());
//get random number of diamonds for obstacle
int numDiamonds = Integer.parseInt(numFoundDiamonds.next());
System.out.println("Number of Diamonds: " + numDiamonds);
//set currentValue for the progress bar
final int currentValue = i;
for(int j = o.getRemovalTime(); j >= 0; j--) {
final int rSecs = j;
System.out.println("Time remaining to remove: " + rSecs);
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setString(currentValue + "/" + maxDiamonds);
statusLabel.setText("Found " + o.getName() + ". Removing: " + rSecs + " s Remaining.");
}
});
java.lang.Thread.sleep(1000);
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
i += numDiamonds;
}
}
Возможно, я упускаю из виду что-то простое.
Я также могу предоставить больше кода относительно других используемых классов, но я чувствую, что проблема заключается в предоставленном коде.
1 ответ
Ты звонишь Thread.sleep(...)
в потоке событий Swing, который переведет весь поток Swing и приложение в спящий режим. Используйте фоновый поток, такой как с SwingWorker.