假设我们有一个简单的 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(使用前将#替换为@)