【问题标题】:How to reuse GUI objects (Flyweight pattern)如何重用 GUI 对象(享元模式)
【发布时间】:2017-07-28 08:20:01
【问题描述】:

在我的 Java 应用程序中,我有一个复杂的 GUI,它重复了某些 JPanel(自定义控件),比如说 100 次(实际上它可能更多,但我不想让这个例子太复杂)。 这 100 个 JPanel 中的每一个都包含 4 个 JTextBox 控件,它们向用户显示某些值。

一个面板的 JTextBoxes 可能是空的,而在另一个面板中可能只有一个值,在其他一些面板中,所有框都可能显示一些数字,你明白了 - 我不知道哪个面板的哪个文本框将包含哪个数据。

现在,为了减少内存占用,我开始学习享元设计模式。这似乎正是我需要的东西,但是,如果我保留一个 JPanel 作为种子,并用它来表示其他 99 个面板(只是相应地更改 JTextBox 值),这意味着所有这些面板将共享共同的参考。

在这种情况下,更改其中一个中的 JTextBox 值也会更改所有其他中的值,对吗? 如何克服这个问题,同时仍然保持应用程序的低内存占用?

我错过了什么吗?

【问题讨论】:

  • 是的,这个问题被简化了。在我的实际应用程序中,用户必须了解他们当前存储的所有可能数据
  • 什么是“JTextBox”?请更具体地描述您的需求。 Swing 已经有轻量级的渲染器类型组件,例如 JTable,但很难知道它是否适合您的需要。
  • 你可能想对 MVC 做一些研究
  • 抱歉耽搁了。不,我实际上并没有尝试创建电子表格。这些面板有一些特殊的功能,通常它们以一对夫妇的形式显示,但在某个“历史”窗口中,我实际上必须显示一个完整的列表,其中包含这些面板彼此堆叠。

标签: java swing design-patterns flyweight-pattern


【解决方案1】:

许多现有的 Swing 组件,包括 JListJTableJTree,都使用 flyweight patternrender and edit 单元格。在此 JTable example 中,StatusPanel 包含一个 ButtonGroup 和几个 JRadioButton 实例,反映了从 enum Status 中选择的值。 StatusRenderer 的单个实例为状态列中的给定行呈现TableModel 状态。同样,StatusEditor 的单个实例允许更新状态列中给定行的TableModel 状态。特别是,只有 TableModel 在视图更新之间实际存储数据;渲染器和编辑器对每一行重复使用。

如果您不能使用现有的享元组件,answer 概述了该方法,包括一个完整的示例并引用了有用的教程。

【讨论】:

  • 另见BasicTableUI,它在paintCell() 中使用CellRendererPane
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多