JTable 合并

原创
2011/12/08 16:03
阅读数 3K

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隔离的是相当的清晰。

 

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

 

 

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
解决setDataVector中循环调用导致堆栈溢出问题:
2019/10/22 16:07
回复
举报
Monkey博主

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

能否贴点代码?上面的网址找不到网页,可能是时间太长了

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm

谢谢楼主,非常感谢!!!不过我这运行出错,我再调试一下

有个重载的方法出问题了,导致堆栈溢出。

AttributiveCellTableModel类中的setDataVector()方法,该如何改呢?万分感谢

好像是不要调用父类的就可以了,具体我忘记了,你看看在那地方堆栈溢出的,时间长了不记得了。

Exception in thread "main" java.lang.StackOverflowError
  at java.util.Vector.<init>(Unknown Source)
  at MultiSpanCellTableExample.AttributiveCellTableModel.setDataVector(AttributiveCellTableModel.java:45)
  at javax.swing.table.DefaultTableModel.setColumnIdentifiers(Unknown Source)
  at MultiSpanCellTableExample.AttributiveCellTableModel.setDataVector(AttributiveCellTableModel.java:46)
  at javax.swing.table.DefaultTableModel.setColumnIdentifiers(Unknown Source)
而AttributiveCellTableModel类中的setDataVector()中的第44-46行为 dataVector = new Vector(0);
   setColumnIdentifiers(columnNames);
   dataVector = newData;

实在是不会改,帮忙再想想呗,万分感谢!!!!!

有个死循环在调用,你自己看看就知道了啊。设个断点调试一下就知道了啊
2013/01/21 18:07
回复
举报

引用来自“Monkey”的评论

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

能否贴点代码?上面的网址找不到网页,可能是时间太长了

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm

谢谢楼主,非常感谢!!!不过我这运行出错,我再调试一下

有个重载的方法出问题了,导致堆栈溢出。

AttributiveCellTableModel类中的setDataVector()方法,该如何改呢?万分感谢

好像是不要调用父类的就可以了,具体我忘记了,你看看在那地方堆栈溢出的,时间长了不记得了。

Exception in thread "main" java.lang.StackOverflowError
  at java.util.Vector.<init>(Unknown Source)
  at MultiSpanCellTableExample.AttributiveCellTableModel.setDataVector(AttributiveCellTableModel.java:45)
  at javax.swing.table.DefaultTableModel.setColumnIdentifiers(Unknown Source)
  at MultiSpanCellTableExample.AttributiveCellTableModel.setDataVector(AttributiveCellTableModel.java:46)
  at javax.swing.table.DefaultTableModel.setColumnIdentifiers(Unknown Source)
而AttributiveCellTableModel类中的setDataVector()中的第44-46行为 dataVector = new Vector(0);
   setColumnIdentifiers(columnNames);
   dataVector = newData;

实在是不会改,帮忙再想想呗,万分感谢!!!!!
2013/01/21 16:25
回复
举报
Monkey博主

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

能否贴点代码?上面的网址找不到网页,可能是时间太长了

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm

谢谢楼主,非常感谢!!!不过我这运行出错,我再调试一下

有个重载的方法出问题了,导致堆栈溢出。

AttributiveCellTableModel类中的setDataVector()方法,该如何改呢?万分感谢

好像是不要调用父类的就可以了,具体我忘记了,你看看在那地方堆栈溢出的,时间长了不记得了。
2013/01/21 15:09
回复
举报

引用来自“Monkey”的评论

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

能否贴点代码?上面的网址找不到网页,可能是时间太长了

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm

谢谢楼主,非常感谢!!!不过我这运行出错,我再调试一下

有个重载的方法出问题了,导致堆栈溢出。

AttributiveCellTableModel类中的setDataVector()方法,该如何改呢?万分感谢
2013/01/21 13:35
回复
举报
Monkey博主

引用来自“达达主义”的评论

引用来自“Monkey”的评论

引用来自“达达主义”的评论

能否贴点代码?上面的网址找不到网页,可能是时间太长了

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm

谢谢楼主,非常感谢!!!不过我这运行出错,我再调试一下

有个重载的方法出问题了,导致堆栈溢出。
2013/01/21 11:39
回复
举报

引用来自“Monkey”的评论

引用来自“达达主义”的评论

能否贴点代码?上面的网址找不到网页,可能是时间太长了

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm

谢谢楼主,非常感谢!!!不过我这运行出错,我再调试一下
2013/01/21 11:25
回复
举报
Monkey博主

引用来自“达达主义”的评论

能否贴点代码?上面的网址找不到网页,可能是时间太长了

http://www.java2s.com/Code/Java/Swing-Components/MultiSpanCellTableExample.htm
2012/12/10 09:10
回复
举报
能否贴点代码?上面的网址找不到网页,可能是时间太长了
2012/12/06 22:23
回复
举报
更多评论
打赏
9 评论
1 收藏
0
分享
返回顶部
顶部