通常在使用JTable
or时JTree
,用户会定义自己的单元格渲染器。
DefaultTableCellRenderer
从 继承用户的组件并实现渲染器方法是很常见的getTableCellRendererComponent
。事实证明,DefaultTableCellRenderer
实际上继承自 JLabel,因此在调用 super(在 render 方法中)时返回自身(this),因此用户的渲染器也可以类似地返回自身(this)。
这一切都运作良好。
我的问题是怎么可能?
每次表调用此方法时,都会为其赋予不同的参数,并且输出标签会根据这些参数而更改。如果它确实是标签的同一个实例——不应该根据最后一次调用这个方法来改变它吗?这是否意味着所有表格的单元格都被感染了由相同的标签实例组成,该标签实例具有相同的值(最后一次调用渲染器方法的值)?
我已经搜索了网络,并在 Swing 的代码中挖掘,但找不到任何克隆或复制构造函数实际上复制输出标签的行为。我找不到任何证据表明(也许)swing 使用反射来每次从头开始重新实例化渲染器。
我已经阅读了关于 JTables 的 Swing 教程,在那里我可以找到下一行:
您可能希望表格中的每个单元格都是一个组件。但是,出于性能原因,Swing 表的实现方式有所不同。相反,单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格。您可以将渲染器视为一个可配置的墨迹标记,表格使用该墨迹标记将适当格式的数据标记到每个单元格上。当用户开始编辑单元格的数据时,单元格编辑器会接管该单元格,控制该单元格的编辑行为。
他们给出了一个提示,我所说的确实是正确的,但没有解释它是如何实现的。
我无法得到它。你们中的任何一个都可以吗?