Renderer of "class-based" or "column-based"

TableCellRenderer是所有的renderer都必须要实现的接口。当然,你可以使用默认的机制,来为一个特定的列选择一个特定的renderer(也就是说,通过这个列的TableColumn的方法setCellRenderer(myColumnBasedRenderer)来给这个列加上一个renderer)。不过,简单的table都是用一个默认的TableColumnModel来建立的,而这个TableColumnModel则是通过这个table的TableModel自动建立的, 在这个自动建立的TableColumnModel里的所有的列,都根本就没有配置任何默认的renderer。当某个列没有被配置上一个renderer时,UI class就会基于这个列中的数据的类型来为某个列分配renderer。那么这个列的数据的类型又是从哪里来的呢,是这样的,这个类型来自TableMode的Class getColumnClass()方法的返回值。这些返回值的用处就是用来从一个defaultRenderersByColumnClass(defaultRenderersByColumnClass是JTable的属性,当table被建立时,这个属性会被配置的)中来选择renderer。因为renderer的得来是通过列的数据的类型而得到,所以这叫做是“class-based renderer”(这里的所谓的class-based的renderer,其实是指得从TableModel里面返回的class,这也意味着,一个列也就仅仅可以返回一个Class)。。。。。而所谓的“column-based renderer”是指,配置在TableColumn中的变量cellRenderer.


当到了具体的实现的时候,所谓的class-based/column-based的renderer其实根本就没有任何的内在的差异,反正就是renderer嘛!!所谓的class-based/column-based其实,仅仅就取决于renderer是如何被选择的。不过,大多数情况下,所谓column-based renderer是改进的class-based renderer, 改进的更为优雅,更为好用。举例来说,你可能想把默认的number renderer应用到所有的数字上,不过最右边的这个table的列,你却不想使用这个renderer,可能由于一些特殊的原因,你想使用用大字号的字体或者不同的颜色来显示这个列的内容。这样你就不能通过这个列中的数据的类型(所谓的这个列的数据的类型,其实不是真正的这个列的数据的类型,这完全取决于TableModel 的 Class getColumnClass())来体现这个区别了,因为这些列的数据的类型,都是Number的,这样,由于他们的类型是一样的,那么得到的renderer也是一样的,所以无法得到不同的renderer。这时,你就要这么作了,你不要给这个列使用默认的选择了,你需要,给这个需要特殊显示的列分配一个renderer(也就是说,这个列的renderer是,column-based的了),而这个renderer当然就是你自己定义的,可以正确显示你想要的效果的一个renderer了。 

阅读更多
换一批

没有更多推荐了,返回首页