【问题标题】:Java Swing: how do I properly instantiate GUI and pass domain objects?Java Swing:如何正确实例化 GUI 并传递域对象?
【发布时间】:2011-12-13 08:41:48
【问题描述】:

我有一个带有嵌套面板的 GUI(带有嵌套面板等选项卡)。我需要将域对象传递给深度嵌套的面板。我可以想到两种方法:

  • 在一处实例化所有 gui 对象,例如框架类。那 会使传递域对象变得简单,但 Frame 类会 巨大且难以维护。

  • 每个面板都有自己的类,我们在其中对其进行实例化和布局
    成分。现在它易于维护并且类很干净,但是如何
    传递我的域对象链?我不想连锁传递 他们通过甚至不应该知道他们的面板的构造函数
    存在。顶层面板将有大量的这些对象 开始。

Niether 方式似乎是一种解决方案。您通常如何处理这个问题?

【问题讨论】:

  • 一个有趣的问题,我不确定专业人士如何解决这个问题,但一个想法是域对象(无论是什么)不会直接传递给 GUI,而是传递给它的模型,并且 GUI 将附加侦听器以对模型中的更改做出反应。谢谢你的问题。我要听这个帖子,看看专业人士怎么说。
  • 此链接可能很有用:Java GUI Development: Reintroducing MVC。我知道我觉得它很吸引人!
  • MVC 是正确的指导原则:每个视图都应该包含对其所侦听的模型的引用。 IMO,问题中没有足够的细节可以说更多。另请参阅answer
  • @HovercraftFullOfEels - 您应该发布该链接作为答案。很有启发性。希望我在第一次开始处理 Swing 时就知道这一点。

标签: java oop swing design-patterns


【解决方案1】:

这是一种责任链模式。我要做的是创建一个包含所有显示对象的地图,并将其从构造函数传递到构造函数。这样,每个实例都可以从地图中获取所需的内容,而无需关心还有什么。

【讨论】:

    【解决方案2】:

    当我组装一个 Java Swing GUI 时,我为每个主要的 GUI 元素都有一个数据模型。请注意,这不是 MVC 模式。这更像是本地 MV 模式。如果您愿意,可以将 GUI 元素侦听器视为“控制器”。

    每个面板都有自己的类,我们在其中实例化和布局它 成分。现在它易于维护并且类很干净,但是如何 我应该将我的域对象沿链传递下去吗?

    你有正确的想法,虽然你不应该做太多的传递。

    我的JFrame(或JApplet)将有一个全局类型字段的关联模型类。这个模型类的一个实例通常会传递给子元素。这是为了让子元素在选择菜单选项时做出正确反应(例如)

    我的JPanel(s) 将有一个关联的模型类来维护文本或按钮子元素的状态。

    更复杂的子元素,如JListJTree,已经有一个关联的数据模型。为方便起见,我可能会将这些关联的数据模型包装到 JPanel 模型类中。

    子元素将触发某种选择或动作侦听器。除了与父级关联的模型类之外,其中一些侦听器可能需要访问模型类。在这种情况下,您必须将模型类的实例传递给侦听器。

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      相关资源
      最近更新 更多