gpt4 book ai didi

java - SwingWorker:很少调用 propertyChange

转载 作者:行者123 更新时间:2023-11-29 07:12:51 25 4
gpt4 key购买 nike

我似乎对 SwingWorker 有疑问。我基本上实现了从我的 JFrame 的 propertyChange() 方法更新 UI 的 Java 示例代码。

我还在 doInBackground 中复制了 sleep 最多一秒的部分。这使我的 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(...) 方法。了解 == 检查两个 对象 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,并且这才是最重要的。所以不是

if (fu == "bar") {
// do something
}

做,

if ("bar".equals(fu)) {
// do something
}

或者,

if ("bar".equalsIgnoreCase(fu)) {
// do something
}

关于java - SwingWorker:很少调用 propertyChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com