Java Observable/Observer 与仅传递引用

标签 java reference observable

我试图掌握几个概念。假设您有一个 JFrame,并且在该 JFrame 中有两个面板,我们称之为 left_half 和 right_half。如果我在 right_half 中单击一个按钮,我希望在 left_half 中有所改变。问题是右半边不知道左半边的存在。所以,你可以告诉 Frame,但从技术上讲,两个小组都不知道 Frame 的存在,对吧?框架可以改变面板,但面板不能改变框架,至少在我看来是这样。

因此,我将对框架的引用传递到面板中。现在 right_half 可以调用 Frame.setVariable(data) 并且 Frame 可以从相同的方法调用 left_half.setStuff(data)。这对我来说似乎是错误的,我一直在寻找一种方法来做到这一点,而无需在层次结构中上下传递引用。

接下来,有人说“这就是 Observable 存在的原因!!”酷,我心想。然后我发现许多关于如何使用 Observable 的令人困惑的示例,这些示例根本没有帮助。终于看到这个了,有道理。 http://www.javaquizplayer.com/blogposts/blogpost7.html 然而,它有这个:“observable.addObserver(mainWindow);” mainWindow 相当于我上面示例中的 Frame,它必须传递一个引用以将 Obserable 附加到!所以即使使用 Observable,我也必须将引用向下传递到层次结构中?

这似乎是错误的。如果没有错,那也好……我可以这样做。然而,一旦所有的背景故事都结束了,我的问题就是:你应该如何在两个面板之间传递数据?如果使用通俗易懂的语言,我可以接受抽象答案;如果代码示例简短且易于理解,我也可以接受。我不是专业的 Java 编码员,我不能只搜索 29 个 API 页面和 1400 行代码,然后突然理解它是如何工作的……但是。我会到那里。

最佳答案

可观察模式(以事件监听器的形式)是可以的,是很好的做法。你看,即使 RightPanel 知道某人可能正在监听它的所有事件,它也不知道正在监听。好吧,从技术上讲,它可以遍历所有的听众并使用反射来找出他们是谁;现在,将是不好的做法。

事实上,RightPanel 知道有人可能在听它,仅此而已。组件总是知道有人可能在听,因为整个 Swing 都是基于它的。重要的是 RightPanel 在没有 LeftPanel(或框架)的情况下进行编译,并且与其完全分离,除了通过监听器接口(interface)。不仅酷,而且标准。

作为旁注,您的类结构不必反射(reflect)您的嵌套面板层次结构。根据您的操作,从 Frame 的内部类控制左右面板的行为可能完全没问题。 (就个人而言,我会使用 JPanel,而不是 JFrame,因为它具有更大的灵 active ,但可以很容易地重构)。否则,您可能会将 View/Controller 拆分为太多紧密耦合的类,这会违反封装并导致大量样板代码。通常,我不会编写大的胖类并尝试将它们重构为较小的类; Swing 通常是个异常(exception)。一个大的胖类比密集耦合类的迷宫更好。当然,除非你有一个可重用的组件或一些可以清晰直观地解耦的功能;不仅仅是几个本身没有意义的按钮或复选框。某些子组件位于组件树中的某个面板内这一简单事实不应成为恕我直言的主要因素。

就此而言,我通常不嵌套 JPanel;我使用 MigLayout 并将所有组件制作成 sibling 。品味问题!我只是鼓励您先查看 MiGLayout,看看您是否喜欢它。

关于Java Observable/Observer 与仅传递引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22277938/

相关文章:

java - 修改Http响应

json - 以 Angular 2 在 Ngfor 上迭代一个 json 对象

java - 如何将 rxJava2 的 Observable 转换为 Completable?

c++ - 模板仿函数无法推导出引用类型

c++ - 导致无法解析的外部符号的常量引用参数

java - 如何将对象传递给构造函数?

RxJS Observables 嵌套订阅?

Java - 从另一个类调用变量

java - 如何将一个类的值用于另一个类从主方法调用

java - 如何使用 NetBeans GUI 创建器将 jPanel 动态添加到已添加到 JFrame 的 JScrollPane?