我似乎对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
}

10-08 03:15