0

我正在构建一个基于 MVC 的 Java 应用程序,并且我的控制器中有一个特定的方法(如下所示),其行为如下:

  • 正如我所希望的那样,模型是通过初始化方法更新的。
  • 视图的更新没有发生,因为该model.start()方法永远不会终止(因为它是一个无限的 while 循环)。

我想先更新我的视图,然后才能更新start()我的模型。如何更改我的代码以获得所需的行为?

我想一种解决方法是用model.start()触发我的模型能够观察到的事件的代码替换该行,但我还没有尝试过,因为我想了解我的问题的根源。

另外,我不知道这是否相关,但是我的主应用程序类通过 为我的摆动组件定义了一个单独的线程SwingUtilities.invokeLater(new Runnable()...,并且我的视图由摆动组件组成。可能存在与多个线程执行相关的一些问题,如果是这样,那就可以解释为什么我的initializedPerformed()方法没有以同步方式执行。

控制器中的方法不像我期望/想要的那样:

public void initializePerformed(Event e) {
    model.initialize(e);
    view.getPanel().setName(model.getName());
    model.start();
}

模型.开始():

public void start() {
    while (true) {

    }
}
4

2 回答 2

1

如果你需要model.start(),我非常怀疑你这样做,然后在一个单独的线程中启动它,如下所示:

new Thread() {
    public void run() {
        model.start();
    }
}

如果model实际上继承自Thread,那么您根本不应该覆盖start()。您应该在新线程实际创建之后和之后run()调用override 。Thread.start()如果您覆盖start(),则不会创建新线程。

于 2013-07-19T22:34:10.713 回答
0

根据我对 swing 的记忆,所有操作都必须由“主”应用程序线程完成(我忘记了它的技术名称)。

模式是:创建线程来处理您的数据,并让主线程仅用于显示。当有应该显示的事件时,通知视图但让主线程更改它(通常使用信号量模式,但如果你觉得它太复杂,你也可以有一个无限循环,每 100 毫秒查看一次新的内容示例并调用 wait() 再次检查:业务线程将更改主线程可访问的变量。

最好的问候,齐德哈姆迪 http://1vu.fr

于 2013-07-19T23:50:11.290 回答