JTable
或JTree
时,用户会定义自己的单元格渲染器。从
DefaultTableCellRenderer
继承用户组件是非常常见的,实现渲染方法getTableCellRendererComponent
。事实上,DefaultTableCellRenderer
继承自JLabel,因此在调用super(在渲染方法中)时返回自身(this),因此用户的渲染器也可以同样返回自身(this)。这一切都很好地运作着。
我的问题是如何做到的?
每次表格调用该方法时,它都会给出不同的参数,并且输出标签会根据这些参数的函数而改变。如果确实是标签的相同实例-难道它不应该根据对此方法的最后一次调用进行更改吗? 这是否意味着所有表格的单元格都由相同的标签实例组成,该实例保存相同的值(最后一次调用渲染器方法的值)?
我在网上搜索并查看了Swing的代码,但是没有找到任何克隆或复制构造函数来复制输出标签的实际操作。我没有发现任何证据表明Swing使用反射来每次从头重新实例化渲染器。
我阅读了Swing的JTables教程,在那里我找到了下面这些内容:
你可能期望表格中的每个单元格都是一个组件。但出于性能原因,Swing表格的实现方式不同。 相反,通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格。您可以将渲染器视为可配置的墨水印章,表格使用它将格式正确的数据盖印到每个单元格上。当用户开始编辑单元格的数据时,单元格编辑器接管单元格,控制单元格的编辑行为。
他们给出了一个提示,即我的说法是正确的,但没有解释如何实际完成。
我无法理解。你们有谁能理解吗?