【发布时间】:2012-11-20 07:30:06
【问题描述】:
通常在使用JTable 或JTree 时,用户会定义自己的单元格渲染器。
从DefaultTableCellRenderer继承用户的组件是很常见的,并实现了渲染器方法getTableCellRendererComponent。事实证明,DefaultTableCellRenderer 实际上继承自 JLabel,因此在调用 super(在 render 方法中)时返回自身(this),因此用户的渲染器也可以类似地返回自身(this)。
一切都很好。
我的问题是怎么可能?
该方法每次被表调用时,都会被赋予不同的参数,并且输出标签会随着这些参数的变化而变化。如果它确实是标签的同一个实例——不应该根据最后一次调用这个方法来改变它吗? 这不是说表格的所有单元格都被感染了由相同的标签实例组成,它拥有相同的值(最后一次调用渲染器方法的值)?
我已经搜索了网络,并在 Swing 的代码中进行了挖掘,但找不到任何实际复制输出标签的 clone 或 copy constructor 行为。 我找不到任何证据表明(可能)swing 使用反射来每次从头开始重新实例化渲染器。
我已经阅读了 Swing 的 tutorial on JTables,在那里我可以找到下一行:
您可能希望表格中的每个单元格都是一个组件。但是,出于性能原因,Swing 表的实现方式有所不同。 相反,单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格。您可以将渲染器视为一个可配置的墨迹标记,表格使用该墨迹标记将适当格式的数据标记到每个单元格上。当用户开始编辑单元格的数据时,单元格编辑器会接管该单元格,控制该单元格的编辑行为。
他们暗示,我所说的确实是正确的,但没有解释它是如何实现的。
我听不懂。你们中的任何一个都可以吗?
【问题讨论】:
标签: java swing jtable jtree renderer