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

标签 java multithreading design-patterns swing passive-view

我正在尝试实现 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/

相关文章:

java - Spring STS DB 与 Jpa 的连接

java - Spring Boot 依赖错误 gradle

java - 将参数传递给 Java 线程

java - 单例模式和同步模式有什么区别

c# - 为给定对象从服务器向客户端发送 ‘updated only fields’ 的模式/技术?

python - 返回不同数量和类型的值?

java - 内存中引用变量和对象的逻辑结构/详细信息?

java - 在 eclipse 中看不到建议

mysql - 使用多线程缓慢的mysql数据库恢复(delphi)

java - 当线程尝试调用静态和非静态同步方法时会发生什么?