我注意到这很常见。例如 DefaultListCellRenderer、DefaultTableCellRenderer 和 DefaultTreeCellRenderer 都使用它。我在网上看到的许多自定义单元格渲染器也使用它。我想在代码中使用自定义 TableCellRenderer,但我对是否真的需要子类化 JLabel 感到困惑。子类化 JLabel 有什么好处?
The DefaultTableCellRenderer 的 API http://download.oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableCellRenderer.html states:
table 类定义了一个单元格渲染器,并将其用作渲染表中所有单元格的橡皮图章;它渲染第一个单元格,更改该单元格渲染器的内容,将原点移动到新位置,重新绘制它,等等。标准JLabel
组件不是设计用于这种方式使用的,我们希望避免触发revalidate
每次绘制单元格时。这会大大降低性能,因为revalidate
消息将沿着容器的层次结构向上传递,以确定是否有任何其他组件受到影响。由于渲染器仅在绘画操作的生命周期内具有父级,因此我们同样希望避免与遍历绘画操作的层次结构相关的开销。所以这个类重写了validate
, invalidate
, revalidate
, repaint
, and firePropertyChange
方法为无操作并覆盖isOpaque
方法只是为了提高性能。如果您编写自己的渲染器,请记住这一性能考虑因素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)