【发布时间】:2012-02-16 21:10:02
【问题描述】:
在我的应用程序中,有许多视图(子组件)并且只有一个控制器。在一个视图中选择某些选项可以更改另一个视图中的布局和组件数量。 控制器初始化视图,然后创建所有子组件。
在这样的应用程序中,控制器是否需要引用所有子组件? 正如在一个视图中的侦听器中调用控制器来执行操作,然后需要更新另一个视图。 我觉得控制器不应该有对所有视图的引用,但不知道从哪里形成这里。 Head first design patterns book 中的示例只有一个视图,所以我被卡住了。
++++++++++++++++++++++++++
更多细节。 我正在写的游戏是跳棋(选秀)游戏。在一种情况下,当计算机与自己对战时,用户必须在游戏开始前选择一些选项。一种这样的选择是在游戏期间选择特定时期的游戏策略。比如当它有12到8个棋子时,它会攻击更多,当它有8到4个棋子时,它会更防守。
目前游戏 GUI 的结构方式是有一个整体 JPanel (RightContainerFrame),其中包含其他 JPanel;然后有一个 JPanel (StartGamePanel),用户可以在其中配置游戏。还有一个包含选项卡的 JTabbedPane (jTabbedPane1)。目前在 StartGamePanel 中,当用户在 JComboBox 中选择某个选项时,需要在 jTabbedPane1 中添加或删除选项卡。
我目前实现这一点的方式是在 StartGamePanel 中
RightContainerFrame.getInstance().generateAndDisplayPlayerTwoRangeTabs(numberOfRangeTabsNeeded);
现在我知道这都是错误的,因为我有一个视图,StartGamePanel 通过调用另一个容器视图 RightContainerFrame 中的方法直接更改另一个视图 JTabbedPane。
我愿意接受有关如何构建此问题的任何建议。
首先,我可以将jComboBox1ActionPerformed 方法移至控制器。这可以更新 jTabbedPane1 的模型。或者它可以直接在 jTabbedPane1 中调用一个方法来显示所需的选项卡数。
【问题讨论】:
-
当您说“许多视图”时,我通常会想到许多不同的 GUI,每个 GUI 都以不同的方式显示信息。如果您不是这个意思,但另一方面意味着有一个 GUI(一个视图)在不同部分显示数据的不同部分,那么答案会有所不同。请说清楚。如果是后者,那么控件只需要对主视图的引用,但这需要公共方法,以便控件可以更改其状态,并且视图可以响应这些状态更改。
-
我的意思是一个 GUI 有很多 JPanel,一个 JPanel 中的选择会影响其他 JPanel 中显示的信息。主视图会引用所有子组件吗?
-
什么是主视图?控制器?
-
在我的版本中,在控制器构造函数中创建视图。然后,此视图创建所有子组件。所以这是正确或错误的主要观点。
public Controller() { ... this.gameView = new GameView(this); -
除了你应该努力“最大限度地提高内聚力并最大限度地减少耦合”之外,我不知道任何一刀切的答案,但这似乎是最好的。我尽量让我的观点变得愚蠢,让我的模型尽可能地不了解观点和控制。如需更具体的建议,您可能需要告诉我们更多细节并发布您的代码。
标签: java swing design-patterns