如何重用GUI对象(Flyweight模式)

时间:2017-07-27 17:56:25

标签: java swing design-patterns flyweight-pattern

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

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

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

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

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

image

如果您无法使用现有的flyweight组件,则此answer概述了该方法,包括完整示例并引用了有用的教程。

image