gpt4 book ai didi

java - Swing、被动 View 和长时间运行的任务

转载 作者:搜寻专家 更新时间:2023-11-01 02:55:33 27 4
gpt4 key购买 nike

我正在尝试实现 Passive View基于 swing 的 gui 系统。基本上我想保持我的 View 实现(实际包含 swing 代码的部分)最少,并在我的 Presenter 类中完成大部分工作。 Presenter 应该不依赖于 swing,也应该“运行表演”,即告诉 View 该做什么,而不是相反。

我在处理长时间运行的任务和一般的线程分离时遇到了问题。我希望 GUI 更新在 EDT 上运行,而演示者逻辑在不同的线程上运行。如果我想让演示者更新 GUI 的某些部分,这很容易,我会这样写:

public interface View {
void setText(String text);
}

public class Presenter {
View view;
...
public void setTextInVIew() {
view.setText("abc");
}
}

public class MyFrame implements View {
JTextField textField;
...
public void setText(final String text) {
SwingUtilities.InvokeLater(new Runnable() {
public void run() {
textField.setText(text);
}
});
}
}

但是,当 GUI 通知演示者发生了某些操作时,我想切换出 EDT 以在不同的线程中对其使用react:

public class Presenter {
...
public void buttonPressed() {
// shouldn't run on EDT
}
}

public class MyFrame implements View {
JButton button;
public MyFrame() {
...
button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
presenter.ButtonPressed();
}
});
}
}

由于 actionPerformed 代码是从 EDT 运行的,因此 presenter.buttonPressed 也是如此。我知道 swing 有 SwingWorker 的概念——在不同的线程中运行任务,但看起来我必须将 swing 代码插入我的演示者中,并且 View 正在运行节目。有什么解决办法吗?

最佳答案

您可以执行类似以下操作,这将使您的 GUI 代码保持原样并简单地执行工作以退出 EDT:

 button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
SwingWorker sw = new SwingWorker() {
public Object doInBackground(){
presenter.ButtonPressed();
return null;
}
};
sw.execute();
}
});

关于java - Swing、被动 View 和长时间运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2341752/

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