如何使用 Swing GUI 启动 Java MVC 应用程序

2024-04-28

假设我们有一个简单的 Java MVC 应用程序,其中包含以下类Model, View and Controller. The View类直接继承自JFrame http://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html。正如在一个经典的 MVC 设置 https://upload.wikimedia.org/wikipedia/commons/b/b5/ModelViewControllerDiagram2.svg,视图具有对模型的引用,控制器具有对视图和模型的引用。 正如我刚刚了解到的,所有与 GUI 相关的东西都应该包装在SwingUtilities.invokeLater http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeLater%28java.lang.Runnable%29或类似的东西。现在初始化/启动该应用程序的正确方法是什么?我认为模型和控制器的创建不应该在 EDT 内部,对吗?所以我会想出这样的东西:

final Model model = new Model();
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        final View view = new View(model);
        new Thread(new Runnable() {
            @Override
            public void run() {
                new Controller(model, view);
            }
        }).start();
    }
});

这是正确的方法和好主意还是有更好的可能性?

编辑: 正如 @trashgod 正确指出的那样,检查了相关示例here https://stackoverflow.com/a/3072979/230513。然后我延伸我的问题:基本上做了以下事情:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        Model model = new Model();
        View view = new View(model);
        new Controller(model, view);
    }
});

但是在 EDT 中运行整个应用程序不是错误的吗?


所有的代码创建或交互Swing 组件必须在事件调度线程上运行。所以你的代码的第二种形式,即下面的代码是正确的。

`SwingUtilities.invokeLater(new Runnable() {
        @Override
    public void run() {
        Model model = new Model();
        View view = new View(model);
        new Controller(model, view);
    }
});`

所有 UI 代码必须通过 EDT 或工作线程运行的原因是为了避免多线程问题。您可能会看到许多 Swing 程序可能无法在 EDT 中初始化代码。这完全没问题。但当你的挥杆变得复杂时,就有可能出错。我自己在简单的摆动应用程序中从主线程启动,我没有遇到死锁是竞争条件。快速任务使用 EDT,长时间运行的任务使用工作线程。这是关于 ui 上多线程问题的链接 https://weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html

如果我错了,请告诉我

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Swing GUI 启动 Java MVC 应用程序 的相关文章

随机推荐

  • 如何从代理类中检索代理类?

    我将 Hibernate 与代理一起使用 并且获得属于以下类的对象test DBUser EnhancerByCGLIB 40e99a2d 是否有 Hibernate 方法来检索基类 test DBUser在这种情况下 来自代理class
  • 具有更多注入 EJB 实例的无状态 EJB

    我知道无状态 EJB 存储在池中并根据需要进行实例化 我的问题是 当存在更多 EJB 依赖项时会发生什么 例如如下所示 Remote Stateless public class Master EJB EJB private EJB A e
  • Ruby 中 shell 命令的颜色输出

    这是一个简单的 Ruby 脚本 puts ls laG 在 OS X 的 ls 中 G 代表颜色 当在 bash 下运行时 我得到颜色输出 当从 Ruby 脚本运行上述代码时 我在结果输出中看不到颜色或 ANSI 转义序列 根据我所读到的内
  • awk 排序多维数组[重复]

    这个问题在这里已经有答案了 GNU awk 支持多维数组 gnu org software gawk manual gawk Arrays of Arrays q 1 1 dog q 1 2 999 q 2 1 mouse q 2 2 77
  • C# 中如何实现引用返回?

    既然 C GC 可以移动内存 那么如何实现引用返回呢 下面的代码会导致 未定义的行为 吗 public struct Record public int Hash public VeryLargeStruct Data public cla
  • 在 hasRole 中使用 spring:eval

    我在 JSP 中显示属性文件中的某些属性 如下所示
  • 无法在 Struts 中加载配置

    我正在尝试在在线考试中实现 STRUTS Spring 和 HIBERNATE 集成 使用 apache tomcat 7 0 42 在 Eclipse Kepler 中运行项目时 它会抛出以下错误 HTTP Status 404 Onli
  • Typescript深度替换多种类型

    我将 mongodb 与 types mongodb 一起使用 这为我提供了一个很好的 FilterQuery 接口 用于我的 mogodb 查询形状文档集合 在我的域对象类中 我有一些额外的逻辑 例如将日期转换为时刻对象或将浮点数转换为
  • 需要澄清应用程序域

    我需要对这个主题进行一些澄清 因为我刚刚遇到将 swf 加载到重用加载器对象中的问题 假设我有 3 个 SWF 主文件 swfchildA swfchildB swf Main swf 中有一个可重用的加载程序对象 myloader loa
  • 选择项目后 jQuery UI 自动完成触发新事件

    我正在使用 jQuery UI 自动完成 并且尝试实现一些代码 一旦用户从自动完成下拉列表中选择了一个项目 它就会调用另一个函数 我查看了 API 文档 但进展甚微 Call LookUpGroupName ActionResult in
  • 如何从 ext2/ext3 文件系统上的稀疏文件中删除一些块

    当您写入稀疏文件时 ext2 ext3 文件系统会自动分配块 但是当我不再需要其中的某些块时 我发现没有办法做到这一点 感觉就像使用 malloc 而不使用 free 是否可以 释放 稀疏文件的某些块 如果是的话 怎么样 不要告诉我将其复制
  • 本地/离线网站“站点”的全文搜索[重复]

    这个问题在这里已经有答案了 可能的重复 通过 javascript 对 CD Rom 上的静态 HTML 文件进行全文搜索 https stackoverflow com questions 1357173 full text search
  • JavaScript 中的“onclick”和“this”

    我很困惑 为什么内联onclick我们要写onclick hello 而在JS中我们应该写btn onclick hello或者btn addEventListener click hello 对于常规函数 为什么在内联onclick中 t
  • 如何在实体框架中进行“in”查询?

    如何在 linq toEntity 中进行选择以从列表中选择带有键的行 像这样的东西 var orderKeys new int 1 12 306 284 50047 var orders from order in context Ord
  • 创建 JPA 提供者

    有谁知道如何创建自己的 JPA 提供程序 我正在考虑制作一个自定义 JPA 提供程序 它可以与我们使用的 SOAP Web 服务交互 但是 我似乎找不到任何描述如何创建自己的 JPA 提供程序的文档 我应该从哪里开始寻找 你首先要实施jav
  • Postgres 在插入访问 NEW 后触发

    我有一个非常简单的触发器 CREATE OR REPLACE FUNCTION f log datei RETURNS TRIGGER AS BEGIN INSERT INTO logs aktion tabelle benutzer id
  • 何时使用 STRef 或 IORef?

    STRef 和 IORef 之间到底有什么区别 何时使用它们 据我所知 它们都是可变状态 那么它们存在的意义是什么 您可以在其中做更多事情IO单子比ST单子 后者提供可变引用 前者提供可变引用 异常捕获 线程 当然还有IO 使用可以解决问题
  • MVC Action Filters 使用传递给 ActionResult 的参数?

    我创建了一个自定义动作过滤器 http www asp net mvc tutorials older versions controllers and routing understanding action filters cs没有问题
  • 如何向 JFrame 添加多个组件?

    我有一个JFrame 我也有一个Box扩展的类成分 这个盒子类有一个paint制作填充矩形的方法 当我将多个 Box 组件添加到 JFrame 时 当我调用时仅显示最近添加的一个repaint在 JFrame 上 我查看了布局管理器 但我不
  • 如何使用 Swing GUI 启动 Java MVC 应用程序

    假设我们有一个简单的 Java MVC 应用程序 其中包含以下类Model View and Controller The View类直接继承自JFrame http docs oracle com javase 7 docs api ja