我正在尝试在摇摆中实现基于被动 视图的 gui 系统。基本上我想让我的视图实现(实际上包含摆动代码的部分)最小化,并在我的 Presenter 类中完成大部分工作。Presenter 应该不依赖于 swing,并且应该“运行节目”,即告诉视图要做什么,反之亦然。
在处理长时间运行的任务和线程分离时,我遇到了问题。我希望 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 以在不同的线程中对其做出反应:
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 代码插入到我的演示者中,并且视图正在运行节目。任何想法如何解决这个问题?