在我的Java应用程序中,我有一个复杂的GUI,其中重复了某些JPanel(自定义控件),可以说100次(实际上可能会更多,但是我不想让这个示例过于复杂)。
这100个JPanel中的每一个都包含4个JTextBox控件,这些控件向用户显示某些值。
一个面板的JTextBoxes可能是空的,而在另一个面板中的JTextBoxs可能有一个值,在另一些面板中的所有文本框都可能显示一些数字,您就会明白-我不知道哪个面板的哪个文本框将包含哪些数据。
现在,为了减少内存占用,我开始学习Flyweight设计模式。似乎正是我需要的东西,但是,如果我保留一个JPanel作为种子,并使用它表示其他99个面板(只需相应地更改JTextBox值),则意味着所有这些面板将共享公共引用。
在那种情况下,更改其中一个的JTextBox值也会更改所有其他值,对吧?
如何克服这个问题,同时又保持应用程序的内存占用量少?
我想念什么吗?
最佳答案
许多现有的Swing组件,包括JList
,JTable
和JTree
,都使用flyweight pattern到render and edit单元。在此JTable
example中,StatusPanel
包含一个ButtonGroup
,其中JRadioButton
的多个实例反映了从enum Status
中选择的值。 StatusRenderer
的单个实例为状态列中给定行呈现TableModel
状态。同样,单个StatusEditor
实例允许更新状态列中给定行的TableModel
状态。特别是,只有TableModel
实际上在视图更新之间存储数据;渲染器和编辑器可重复用于每一行。
如果您不能使用现有的flyweight组件,则此answer概述了该方法,包括完整的示例并引用了有用的教程。