【发布时间】:2023-04-02 19:40:01
【问题描述】:
我构建了一个事件通知系统,用于接收设备生成的事件。我有 2 个主要组件:Listener 和 Publisher。 Publisher 将向设备发送轮询命令并捕获事件。然后,它将通过 EventBus 将所有事件通知给 Listener(我使用了 Guava 的 EventBus 库)。现在我实现了一个 View 组件。视图是观察者,模型是可观察的。当监听器接收到一个事件时,它会通知给 Views。 View 扩展了 JFrame 并实现了 Observer。在构造函数中,如: public View(Listener),我只是将View注册为Listener的观察者
问题是当我关闭视图时,程序也关闭了。如何使视图独立于模型? 请帮帮我。
【问题讨论】:
-
快速解决方法是将 JFrame 的 defaultCloseOperation 设置为 JFrame.DISPOSE_ON_CLOSE。一个更好的解决方案可能是将您的视图与您的模型进一步分离,可能在不同的 JVM 上运行它们,为它们提供一些通信机制,也许通过 Streams 作为一种简单的方法来做到这一点。有更高级别的方法可以传输对象(我认为 RMI 和 JINI 是示例),但我从未这样做过,因此无法根据经验说话——这就是为什么这是评论而不是答案的原因。
-
也许你可以分享你的一些代码,这样人们就可以看到究竟是什么关闭了你的程序。否则,这将是疯狂的猜测,例如,您可能会以某种形式使用 System.exit(0) 来关闭您的视图,而不是像建议的气垫船那样处理 ..
-
@Akunosh:
System.exit(...)是他最不想做的事情,如果视图和模型运行在同一个 JVM 上。它将保证模型将关闭,并且与 OP 试图实现的目标完全相反。 -
嗨@HovercraftFullOfEels,我想到了你的解决方案。因为视图是在与模型相同的 main() 类中创建的。但我不知道如何实现该机制。
-
@HovercraftFullOfEels 我知道。也许我翻译错了。我只是怀疑当前的代码包含某种形式的 System.exit(...),例如JFrame.EXIT_ON_CLOSE。我想说的是,仅凭他的描述,没有人能知道他的模型到底是什么。
标签: java swing model-view-controller