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