我正试图抓住几个概念。让我们假设您有一个JFrame,在JFrame中有两个面板,我们会说left_half和right_half。如果我单击right_half中的按钮,我想在left_half中更改一些内容。问题是右半边不知道左半边是否存在。所以,你可以告诉Frame,但从技术上讲,两个小组都不知道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行代码,只是突然理解它是如何工作的......我会到那儿。
答案 0 :(得分:1)
可观察的模式(以事件监听器的形式)是好的,是很好的做法。你看,即使RightPanel知道某人可能正在收听其所有事件,但它并不知道是谁正在收听。嗯,从技术上讲,它可以通过所有的听众,并使用反思来找出他们是谁;现在, 将是不好的做法。
事实上,RightPanel知道某人可能正在倾听它,而这就是全部。组件始终意识到有人可能正在倾听,因为整个Swing都是基于它的。重要的是RightPanel在没有LeftPanel(或框架)的情况下进行编译,并且除了通过侦听器接口之外,它与它完全分离。不仅酷,而且标准。
作为旁注,您的类结构不必镜像嵌套面板层次结构。根据您正在做的事情,从Frame内的内部类控制左右面板的行为可能完全没问题。 (就个人而言,我使用的是JPanel,而不是JFrame,因为它允许更多的灵活性,但这可以很容易地重构)。否则,您可能会将View / Controller拆分为太多紧密耦合的类,这会违反封装并导致许多样板代码。通常情况下,我不编写大胖类,并尝试将它们重构为较小的类; Swing通常是个例外。更好的一个大脂肪类比密集耦合类的迷宫。除非您拥有可重复使用的组件或某些功能,可以清晰直观地分离;不仅仅是几个没有任何意义的按钮或复选框。一些子组件位于组件树中某个面板内的简单事实不应该是恕我直言的主要因素。
就此而言,我通常不会嵌入JPanels;我使用MigLayout并将所有组件都变成兄弟姐妹。味道很重要!我只是鼓励你先看看MiGLayout,看看你是否喜欢它。