我正在构建一个基于MVC的Java应用程序,我的控制器中有一个特定的方法(如下所示),其行为如下:
model.start()
方法永远不会终止(因为它是一个无限的while循环)。我想让我的观点先更新,然后才能start()
我的模型。如何更改代码以获得所需的行为?
我想一个解决方法是将model.start()
行替换为触发我的模型能够观察到的事件的代码,但我还没有尝试过,因为我想了解问题的根源。
另外,我不知道这是否相关,但我的主应用程序类通过SwingUtilities.invokeLater(new Runnable()...
为我的swing组件定义了一个单独的线程,我的视图由swing组件组成。可能存在与多个线程执行相关的一些问题,如果是这样,这将解释为什么我的initializedPerformed()
方法没有以同步方式执行。
控制器中的行为不符合我的期望/想要的方法:
public void initializePerformed(Event e) {
model.initialize(e);
view.getPanel().setName(model.getName());
model.start();
}
model.start():
public void start() {
while (true) {
}
}
答案 0 :(得分:1)
如果你需要model.start()
,我非常怀疑你这么做,那么就在这样一个单独的线程中启动它:
new Thread() {
public void run() {
model.start();
}
}
如果model
实际上是从Thread
继承的,那么您根本不应该覆盖start()
。您应该覆盖在run()
之后调用的Thread.start()
,并在实际创建新线程之后。如果覆盖start()
,则不会创建新线程。
答案 1 :(得分:0)
根据我对swing的记忆,所有操作必须由“主”应用程序线程完成(我忘记了它的技术名称)。
模式是:创建线程来处理数据,并保留主线程仅用于显示。当有一个应该显示的事件时,通知视图,但让主线程改变它(通常使用信号量模式,但如果你发现它太复杂,你也可以有一个无限循环,看起来每100毫秒新的示例并调用wait()再次检查:业务线程将更改主线程可访问的变量。
最诚挚的问候, 齐德哈姆迪 http://1vu.fr