【问题标题】:How should multiple classes be used for an application's different screens?应用程序的不同屏幕应该如何使用多个类?
【发布时间】:2014-12-19 07:11:57
【问题描述】:

我有一个儿童数学游戏应用程序。自从我上大学以来,我过去的所有项目通常只有一个上帝对象,但为了这个应用程序,我将我的代码分成多个类:

  • MathsGame.java:初始化组件并构造和控制 UI 的主类。
  • DiffScreen.java:包含在难度选择屏幕上使用的方法。
  • GameScreen.java:包含在游戏画面上使用的方法。
  • EndGameScreen.java:包含在游戏结束画面上使用的方法。
  • MigJPanel.java:扩展 JPanel 并将布局设置为 MigLayout 并添加一个哑光边框。

3 个 XScreen 类控制的每个屏幕只是 MigJPanel 的一个实例,并且使用 CardPanel 容器 JPanel 切换到屏幕。

我想知道如何将我的代码划分为每个类,以便正确抽象它们,但我不完全确定如何处理这个问题。

  1. 我的 3 个屏幕类是否应该从我的 MigJPanel 扩展,以便可以实例化这些类?

    因此,我的 DiffScreenGameScreenEndGameScreen 类不只包含与每个屏幕相关的方法,然后从 MathsGame 调用,每个屏幕将在其自己的类中控制自己。

  2. 如果上一个问题是肯定的,每个屏幕的 UI 组件是否应该在该屏幕的类中制作?

    目前,三个屏幕的所有组件都是在我的MathsGame 构造函数中创建的。这使得屏幕和“控制”的类之间的联系(我现在非常轻松地使用这个词)之间的联系更加遥远。所以每个屏幕只是MigJPanel 的一个实例,其组件在MathsGame 中构造。例如,EndGameScreen 类与 End Game 屏幕的唯一关系是,当 MathsGame 导致显示 End Game 屏幕时,在那里所做的任何事情都会使 EndGameScreen 中的方法从 MathsGame 调用.

我希望我能很好地解释自己。如果没有,请发表评论,我会澄清。任何帮助将不胜感激!

【问题讨论】:

  • 1- 是,2- 是。专注于自我控制并保持责任范围。管理其内容是每个 UI 屏幕的责任,没有其他人,事实上,您应该防止允许对这些组件进行无限制的修改,并且只能通过托管方法(setter 和 getter)提供访问权限,这允许修改您想要更改的属性,而不仅仅是通过 getter 提供组件,这可以防止人们删除您不想删除的组件时出现问题...
  • 如果需要,您还可以使用接口来维护通用功能,因此如果MathsGame 真的只想处理一定数量的信息/功能,您可以使用所有其他接口屏幕使用将简化流程,因为MathsGame 只需要了解实现接口的类,而不需要了解可能发生的所有其他事情......作为建议......
  • @MadProgrammer 这很有帮助,谢谢!您想将其作为答案,以便我接受吗?另外,我应该把切换屏幕的代码放在哪里?我在每个屏幕类中的ActionListeners 上都出现错误,因为该方法是非静态的,因为该方法是非静态的,但我无法将其设为静态,因为它正在为我的CardLayout 执行show()这是在我的 MathsGame 类中创建的。我假设我应该有 3 种方法在类之间切换,但我应该把它们和我的 CardLayout 放在哪里?

标签: java swing cardlayout


【解决方案1】:
  1. 是的
  2. 是的。

专注于自我控制并保持责任范围。管理其内容是每个 UI 屏幕的责任,没有其他人负责,事实上,您应该防止允许对这些组件进行无限制的修改,并且只能通过托管方法(setter 和 getter)间接提供访问权限,这允许修改您想要更改的属性,而不是简单地通过 getter 提供组件,这可以防止人们删除您不想删除的组件时出现问题。

如果需要,您还可以使用接口来维护通用功能,因此如果MathsGame 真的只想处理一定数量的信息/功能,您可以使用所有其他屏幕都使用的接口,这将简化这个过程,因为MathsGame 只需要知道实现接口的类,而不是可能发生的所有其他事情......作为建议......

另外,我应该把切换屏幕的代码放在哪里?

从我的角度来看,MathsGame 游戏有责任确定何时以及显示哪个屏幕。我通常会做的是提供某种通知过程,当前屏幕可以要求MathsGame 切换屏幕,可能通过侦听器或其他约定的接口。这意味着每个屏幕都需要引用MathsGame

我不会直接传递它(MathsGame),而是创建一个MathsGame 将实现的接口(比如NavigationController),它定义了每个子屏幕可以使用的调用/合同(nextScreen/ previousScreen) 例如。

查看Model-View-Controller 了解更多想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多