我似乎对SwingWorker有问题。
我基本上实现了Java示例代码,通过JFrame的propertyChange()方法更新了UI。
我还在doInBackground中将睡眠最多复制了一秒钟。
这使我的Worker中的setProgress的更新率很高。
但是,propertyChange事件大约每10秒触发一次。
我从API知道并不是每个setProgress都会触发一个事件,我对此表示同意,但是似乎有点慢,而且丢失了太多事件。
在调试器中逐步执行时,我得到了更好的回报,每3次调用setProgress一次
任何想法为什么它这么慢?
这是我的代码的一部分:
public Void doInBackground() {
Random random = new Random();
setProgress(0);
float getSize=0,gotSize=0;
while (Sync.syncing) {
//Sleep for up to one second.
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException ignore) {
ignore.printStackTrace();
}
try{
getSize=Main.getSyncGet();
gotSize=Main.getSyncGot();
System.out.println("setProgress: "+(gotSize/getSize));
setProgress((int)((gotSize/(getSize))*100));
}catch(Exception e){
Main.LOGGER.log(Level.WARNING,"Error setting progress",e);
}
}
return null;
}
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
jpb.setValue((Integer) evt.getNewValue());
}
}
亲切的问候
詹斯
最佳答案
您的问题很可能在这里:
System.out.println("setProgress: "+(gotSize/getSize));
setProgress((int)((gotSize/(getSize))*100));
您是否测试过进度实际上已被更改?更好的println将是:
int value = (int)((gotSize/(getSize))*100);
System.out.println("setProgress: "+ value);
setProgress(value);
现在检查值是否实际上正在改变。
糟糕,这绝对是错误的:
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
jpb.setValue((Integer) evt.getNewValue());
}
}
不要使用
==
比较字符串。请使用equals(...)
或equalsIgnoreCase(...)
方法。理解==会检查两个对象是否相同,这不是您感兴趣的对象。另一方面,方法会检查两个Strings是否具有相同顺序的相同字符,这才是重要的。所以代替if (fu == "bar") {
// do something
}
做,
if ("bar".equals(fu)) {
// do something
}
要么,
if ("bar".equalsIgnoreCase(fu)) {
// do something
}