难以理解swing的JTable和JTree的渲染器机制

avi*_*hen 6 java swing jtable renderer jtree

通常,在使用JTableJTree用户写入和分配时,它是自己的特定单元格渲染器.

从中继承用户的组件是非常常见的DefaultTableCellRenderer,并实现了渲染器方法getTableCellRendererComponent.事实证明,DefaultTableCellRenderer事实上继承自JLabel,因此当调用super(在render方法中)时返回自己(this),因此用户的渲染器也可以类似地返回自己(this).

这一切都运作良好.

我的问题是它怎么样?

每次由表调用此方法时,都会为其指定不同的参数,并根据这些参数更改输出标签.如果它确实是标签的同一实例 - 不应该根据最后一次调用此方法进行更改?是不是意味着所有表格的单元格都是由同一个标签实例组成的,该标签实例保持相同的值(最后一次调用渲染器方法的值)?

我在网上搜索,并在Swing的代码中挖掘,找不到任何实际复制输出标签的克隆复制构造函数.我找不到任何证据表明(可能)swing使用反射,以便每次从头开始重新实例化渲染器.

我已经阅读了关于JTables的Swing 教程,在那里我可以找到下一行:

您可能希望表中的每个单元格都是一个组件.但是,出于性能原因,Swing表的实现方式不同.相反,单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格.您可以将渲染器视为可配置的墨迹标记,该表用于将适当格式化的数据标记到每个单元格上.当用户开始编辑单元格的数据时,单元格编辑器接管单元格,控制单元格的编辑行为.

他们给出了一个暗示,我所说的确实是正确的,但不解释它是如何实现的.

我无法得到它.可以吗?

JB *_*zet 11

这是flyweight模式的一个实现.

当JTable重新绘制自身时,它会启动一个循环并遍历每个必须绘制的单元格.

对于每个单元格,它使用与单元格对应的参数调用渲染器.渲染器返回一个组件.此组件绘制在与当前表格单元格对应的矩形中.

然后为下一个单元格调用渲染器,并且返回的组件(例如,具有不同的文本和颜色)被绘制在与单元格对应的矩形中.

想象一下,每次调用渲染器时,都会获取返回组件的屏幕截图并将其粘贴到表格单元格中.

  • +1 截图比喻是一个很好的比喻。我认为最常用的是“图章”,但截图可能更清晰 (2认同)