gpt4 book ai didi

java - 当 GUI 不更新信息时,使用多线程 SWING 处理 GUI

转载 作者:行者123 更新时间:2023-12-01 19:19:52 25 4
gpt4 key购买 nike

所以我有一个使用 MVC 模式设计的桌面应用程序,灵感来自 this tutorial (但略有修改)。该应用程序需要做的是将文件列表从一个目录复制到另一个目录。我想做的基本上是在复制每个文件后更新我的 GUI。

首先让我向您展示代码。在我的模型中,我有这个虚拟方法(不是真正的方法,但其背后的逻辑是相同的):

public void dummyMethod(Integer k) throws InterruptedException{
for(int i=0;i<10;i++){
System.out.println(i);
Thread.sleep(1000);
this.firePropertyChange(DefaultController.BACKUP_DUMMY, i-1, i);
}
}

在我看来,我有这样的:

@Override
public void modelPropertyChange(PropertyChangeEvent evt) {
// .......


else if( evt.getPropertyName().equals( DefaultController.BACKUP_DUMMY ) ){
System.out.println("WHAT?");
this.dummy.setText(evt.getNewValue().toString());
}

}

正如你可以想象的那样,每次都会打印什么?,但是直到循环完成之后 GUI 才会更新。当您使用 SWING 及其 EDT 时,这是一个典型的问题,我在 oracle 网站上读过此 article/tutorial但我认为我不需要使用 SwingWorker。我只需要更新 GUI 上的单个组件。

最佳答案

but the GUI is not updated until the loop has finished is thing.

这表明您的所有代码都在 EDT 上运行,因此 GUI 无法重新绘制自身,直到整个循环完成。

but I don't think I need to use a SwingWorker.

为什么不呢,这可能是最简单的解决方案。您的主循环在单独的线程上运行,然后在处理每个文件时“发布”结果。

或者使用 Gursel 建议的方法。长时间运行的代码在单独的线程中执行,并且仅在 EDT 上触发属性更改事件,这意味着 GUI 可以在 EDT 上重新绘制自身。

关于java - 当 GUI 不更新信息时,使用多线程 SWING 处理 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4799635/

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