gpt4 book ai didi

Java Swing - 从多线程更新 View

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

这个问题可能会重复,因为我发现了很多类似的问题,但不是我的问题的答案:我需要从不同的 SwingWorker 更新我的 SWING 应用程序的 View 。我有一个带有 JTextArea 和 JTable 的 View 类,我需要在线程执行期间更新它们。该 View 还有一个启动按钮,用于启动所有线程。 Controller 监听要单击的按钮,然后启动线程:

public class MonitorPageController {

private MonitorPage monitorPage;
private List<Mission> missions;

class StartButtonListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < missions.size(); i++) {
MyWorker worker = new MyWorker(missions.get(i));
worker.execute();
}
}
}

}

然后我有管理模型的 MyWorker 类:

public class MyWorker extends SwingWorker<Integer, String> {

private Mission m;

//<dec>
Block block1 = new Block();
Block block2 = new block();
Block block3 = new Block();
Block block4 = new Block();

public MyWorker(Mission mission) {
this.m = mission;
}

@Override
protected Integer doInBackground() throws Exception {
//<exe>
block1.addObserver(block2);
block2.addObserver(block3);
block3.addObserver(block4);
block4.addObserver(block2);
block1.update(null, m);

return 4;
}

}

最后,我需要更新 GUI(JTable 和 JTextArea)的 Block 类:

public class Block extends Node implements Observer {


public Mission run(Mission m) {
m.setStatus(Mission.UNEXECUTED);

// HERE I WANT TO NOTIGY THE VIEW OF THE CHANGE OF STATUS OF THE MISSION

return m;
}

@Override
public void update(Observable o, Object arg) {
Mission m = this.run((Mission) arg);
setChanged();
notifyObservers(m);
}
}

编辑:任务是一个简单的类,其属性:int status

我已经尝试过另一种观察者模式:我将任务设置为可观察,并将 MonitorPageController 设置为观察者。然后,在 Mission 类的状态的 setter 方法中,我添加了 setChanged() 和 notifyObservers() 方法。最后在观察者(MonitoPageController)中我实现了 update() 方法来调用 View 并更新 gui。我喜欢这种方式,因为它干净且易于实现,但我现在不知道为什么,在调用notifyObserver()之后什么也没有发生,所以我放弃了这个解决方案,即使它看起来是正确的。

最佳答案

更新 UI 调用 SwingUtilities.invokeLater() :

public class Block extends Node implements Observer {


public Mission run(Mission m) {
m.setStatus(Mission.UNEXECUTED);
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
//UPDATE UI HERE
}
});
return m;
}

@Override
public void update(Observable o, Object arg) {
Mission m = this.run((Mission) arg);
setChanged();
notifyObservers(m);
}
}

关于Java Swing - 从多线程更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27930204/

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