gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:12 25 4
gpt4 key购买 nike

假设我们有一个简单的 Java MVC 应用程序,其中包含类 ModelViewControllerView类直接继承自JFrame .如在 classic MVC setup , View 具有对模型的引用, Controller 具有对 View 和模型的引用。正如我刚刚了解到的,所有与 GUI 相关的内容都应该包含在 SwingUtilities.invokeLater 中。或类似的东西。现在初始化/启动此应用程序的正确方法是什么?我认为模型和 Controller 的创建不应该在 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 中运行整个应用程序不是错误的吗?

最佳答案

所有创建或与 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 中初始化代码。这完全没问题。但是当你的挥杆变得复杂时,就有可能出错。我自己在从主线程启动的简单 swing 应用程序中,我没有遇到死锁是竞争条件。快速任务使用 EDT,长时间运行的任务使用工作线程。 Here is link on multithreaded problem on ui

如果我做错了请告诉我

关于java - 如何使用 Swing GUI 启动 Java MVC 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108279/

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