我已经阅读了许多关于 JProgressBar 的不同文章……包括在 Java 中发现的不可靠的代码;这里。
大多数人表示您需要一个 SwingWorker 才能使事情正常进行,这很有意义,我明白这一点。我发现当我调用 setProgress(value) 来更新进度条时,它大部分时间都不会触发 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,所以在调用任何 PropertyChangeListeners 之前可能会发生对 setProgress 方法的多次调用。出于性能目的,所有这些调用仅与最后一个调用参数合并为一个调用。
例如,以下调用:
setProgress(1);
设置进度(2);
设置进度(3);
可能会导致一个值为 3 的 PropertyChangeListener 通知。
IE 我认为 setProgress 触发得太快的假设是正确的。ProgressMonitor 可能是更好的解决方案。