为什么单元格渲染器经常扩展JLabel?

Eva*_*Eva 8 java swing jlabel cellrenderer subclassing

我注意到这很常见.例如,DefaultListCellRenderer,DefaultTableCellRenderer和DefaultTreeCellRenderer都使用它.我在网上看到的很多自定义单元格渲染器也使用它.我想在我的代码中使用自定义TableCellRenderer,但我对是否真的需要继承JLabel感到困惑.子类化JLabel有什么好处?

cam*_*ckr 10

DefaultTableCellRendererAPI指出:

表类定义单个单元格渲染器,并将其用作橡皮图章,用于渲染表格中的所有单元格; 它渲染第一个单元格,更改该单元格渲染器的内容,将原点移动到新位置,重新绘制它,依此类推.标准JLabel组件并非设计为以这种方式使用,我们希望避免revalidate每次绘制单元时触发.这会大大降低性能,因为revalidate消息将在容器的层次结构中向上传递,以确定是否会影响任何其他组件.由于渲染器仅在绘制操作的生命周期中具有父级,因此我们同样希望避免与绘制操作的层次结构相关联的开销.所以这个类覆盖了validate,invalidate,revalidate,repaint,和firePropertyChange方法是无操作,并重写isOpaque方法仅仅是为了提高性能.如果您编写自己的渲染器,请记住此性能考虑因素.


Hov*_*els 5

JLabel拥有他们需要的所有火力,然后是一些 - 它处理文本和图标,它可以居中,默认情况下它具有非透明背景,......我可以继续......

  • @eva:啊,我明白了 - 作曲与继承......我不知道那个得分.也许它们会覆盖一些关键方法,例如paint或paintComponent.消息来源可能会说.顺便提一个有趣的问题1+ (2认同)
  • 扩展JLabel是有益的,因为重写了许多方法以使标签的呈现更有效.如果要查看所有空方法,请查看源代码. (2认同)