【问题标题】:How to Start a Java MVC Application With a Swing GUI如何使用 Swing GUI 启动 Java MVC 应用程序
【发布时间】:2013-11-20 22:19:58
【问题描述】:

假设我们有一个简单的 Java MVC 应用程序,其中包含 ModelViewController 类。 View 类直接继承自 JFrame。在classic MVC setup 中,视图具有对模型的引用,而控制器具有对视图和模型的引用。 正如我刚刚了解到的,所有与 GUI 相关的东西都应该包含在 SwingUtilities.invokeLater 或类似的东西中。现在初始化/启动这个应用程序的正确方法是什么?我认为模型和控制器的创建不应该在 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。然后我扩展我的问题:基本上做了以下事情:

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

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

【问题讨论】:

  • 我会“猜测”控制器将需要某种方式来“启动”或“显示”视图...此外,您不应为此使用第二个 Thread,只需执行更新在您粘贴到 SwingUtilities.invokeLaterRunnablerun 方法的上下文中,以便您的所有 UI 交互都在 EDT 的上下文中进行...
  • 检查了一个相关的例子here
  • 查看更新后的问题。 @MadProgrammer:视图已设置并在其构造函数调用中可见。然后通过模型的事件更新它(模型扩展了 Observable 并且视图观察模型)。
  • “但是在 EDT 中运行整个应用程序不是错吗?” 这是上下文相关的。只要模型/视图/控制器不阻塞 EDT,这就是属于的地方。如果任何部分需要执行一些长时间运行的进程,那么它应该将该任务卸载到另一个线程,以免阻塞 EDT
  • 直到一个 JComponent 被“实现”,即可见,你可以在任何你想要的线程上进行设置。完成所有设置,然后致电pack()setVisible()。许多应用程序会产生线程来设置复杂的 GUI。

标签: java swing model-view-controller thread-safety


【解决方案1】:

所有与 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,长时间运行的任务使用工作线程。 Here is link on multithreaded problem on ui

如果我错了请告诉我

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2016-03-07
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多