JProgressBar не вызывает propertyChange для setProgress
Я прочитал много разных статей о JProgressBar ... включая хитрый код, найденный в Java;Вот.
Большинство из них указывают на то, что вам нужен SwingWorker, чтобы все происходило правильно, что имеет смысл, я так понимаю. Я обнаружил, что когда я вызываю setProgress (значение) для обновления индикатора выполнения, он не вызывает событие propertyChange большую часть времени. Я проверил значение, которое я передаю в setProgess, и оно определенно меняется каждый раз, так что я не уверен, слишком ли быстро оно запускает событие? Пожалуйста, смотрите соответствующий код ниже, любая помощь / объяснение будет с благодарностью.
class ProgBar extends SwingWorker
{
public ProgBar()
{
addPropertyChangeListener(new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if ("progress".equals(evt.getPropertyName()))
{
int value = (Integer)evt.getNewValue();
System.out.println("propertyChange called with: " + value);
loginProg.setValue(value);
}
}
});
loginProg.setStringPainted(true);
loginProg.setValue(0);
setProgress(0);
}
@Override
public Void doInBackground() throws InterruptedException
{
...
int count = 0;
for (Folder f : folders)
{
... // process 'f'
setProgress((int)Math.min(((double)count/folders.length)*100.0, 100.0));
}
...
return null;
}
@Override
public void done()
{
System.out.println("Done called.");
setProgress(100);
loginProg.setValue(100);
}
}
JProgressBar вызывается с этим;
private void jButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// Create new thread to run progess bar.
// Otherwise won't be able to update progress bar.
ProgBar pb = new ProgBar();
pb.execute();
}
}
РЕДАКТИРОВАТЬ:
Да, так что я должен был прочитать Javadocs лучше;
Поскольку PropertyChangeListeners уведомляются асинхронно в потоке диспетчеризации событий, несколько вызовов метода setProgress могут произойти до того, как будет вызван любой PropertyChangeListeners. В целях производительности все эти вызовы объединены в один вызов только с последним аргументом вызова.
Например, следующие вызовы:
setProgress (1);
setProgress (2);
setProgress (3);
может привести к одному уведомлению PropertyChangeListener со значением 3.
И.Е. Мое предположение, что setProgress стрелял слишком быстро, было верным. ProgressMonitor может быть лучшим решением.