我读过有关的JProgressBar许多不同的物品......包括在爪哇发现在狡猾的代码; 这里。
大多数表明你需要的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();
}
}
编辑:
是啊,所以我应该更好地阅读的Javadoc;
由于是的PropertyChangeListeners在事件指派异步通知线程多次调用该方法setProgress调用了任意PropertyChangeListener之前可能发生。 为了改进性能,所有这些调用都合并为一个调用,只有最后调用的参数。
例如,下面的invokations:
setProgress(1);
setProgress(2);
setProgress(3);
可能会导致与价值3单一的PropertyChangeListener通知。
IE我的假设setProgress很快被烧成太是正确的。 一个ProgressMonitor可能是一个更好的解决方案。