JTable 合并

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm重写TableUI,来达到实现表格的合并和分解。

这个是日本人写的,而且是1998的代码,在这里也不得不惭愧一下了,估计到现在我们做swing都没几个人能写这样的东西,重构分说明咱们都很浮躁,看看人家做的东西,不多说了,越说越惭愧,简单说一下那个结构。

真正实现表格多行多列合并的是在MultiSpanCellTableUI这个类里实现,这个类完全重新绘制表格从而达到合并的目的。代码很精练,不到100行,就搞定了表格的绘制。

MultiSpanCellTable 继承于JTable,主要是重载了和表格定位相关的方法,比如rowColumnAtPoint,getCellRect,rowAtPoint,这几个方法,根据Model里的数据来重新计算,道理也很简单这样才能正确的判断用户选择的单元格,因为被合并的单元格是无法选择的和无法显示的,所以必须要在这里进行。代码还是百来行。

AttributiveCellTableModel继续于DefaultTableModel,最关键的东西在这里,CellAttribute,他的实现是交给DefaultCellAttribute这个对象的,这个是存储单元格合并信息的地方,而且也是MultiSpanCellTable在计算的重要数据,和MultiSpanCellTableUI绘制的核心数据之一。DefaultCellAttribute有三个接口分别对应表格的功能。

 

CellAttribute保存的是真正的视野上的表格信息,包括表格有多少行多少列(这是视觉上的不是逻辑上),JTable逻辑数据任然是在传统的model,逻辑数据每一次改变都将会映射到这里,会刷新视觉数据。

CellSpan 保存的是单元格的合并属性,可视行,航跨度,列跨度。这些是UI绘制必需的东西。还有就是合并和拆分的功能也在这里,非常值得注意的是,在拆分合并表格的时候,他没有处理任何TableModel和Table的东西,就是在这里处理数据,处理完毕JTable重刷,这种M和V隔离的是相当的清晰。

 

最后还有说的是,人家写代码能力,类都不长,真正的代码大多都是百来行,但是最后实现的功能却让人眼前一亮。小日本写的代码和拍得片子一样,直入主题,不来花拳绣腿的。

 

 JTable 合并

 

你可能感兴趣的:(合并,jtable)