快速业务通道

固定JTable中的前几列 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21

固定JTable中的前几列

时间:2011-01-06 BlogJava kissjava

当很表格中有很多列的时候出现Scrollbar的时候,当用户拖动Scrollbar那么有的列就会看不见,而用户需要输入数据的时候,需要对照第一列或前几列以方便输入数据,则需要固定前几列的需求了。像Excle表格中可以固定前几列,而在JTable中没有直接的方法实现,网上比较流行的方法是用两个JTable,如下图(一)其中一个talbe渲染固定列的数据,另外一个主table渲染其他数据,然后把渲染固定列数据的表格当做装载主table的JScrollPane的Row Header。这样实现就要把表格中的数据拆分成两个TableModel用于其渲染。

其中实现的效果如图二

固定JTable中的前几列 - 编程入门网

图一

固定JTable中的前几列 - 编程入门网

图二

固定JTable中的前几列(2)

时间:2011-01-06 BlogJava kissjava

很显然这种实现方式有一下缺点:

1)、当用户对于自己的表格有自己实现的自定义的列头,比如行的序列号或增加了选择框等等这样就会有冲突。

2)、如上所说当拆分成两个TableModel的时候,那么要很好的维护两个表格一些属性保持一致将很麻烦,比如选择,排序等。

3)、最重要的一点就是如果在其原有的项目中增加这一需求,那么这种方法就要修改很多地方,侵入性太强。

基于上述缺点,Elie Levy 用了另外一种方法,尽管也有些缺点(暂且后面再说),他实现的方法很简单(效果如图三),就是将要固定的列的内容画在一个另外一个组件上然后将这个组件放在JTable之上,其总是占据其表格的指定需要固定的列上,这表格的前几列看起来就是固定了的,如图三,我们需要固定前三列,那么我们将前三列的内容画在一个Label上如图中黑色部分,这时候的关键技术就是利用JLayeredPane的原理了,获得JTable的JLayeredPane,然后将这个画出所要固定列的内容的JLabel加进JLayeredPane,就能忽悠成固定了。

固定JTable中的前几列 - 编程入门网

图三

固定JTable中的前几列(3)

时间:2011-01-06 BlogJava kissjava

主要实现代码分析,实现主要监听鼠标事件,捕捉所要固定的列的内容予以即时更新,这个类FixTableManager为了方便我们继承于JTableHeader,那么在这里我们重写paint()方法:以更新拖动Scrollbar的时候列头的现实信息,代码如:

 @Override  public void paint(Graphics g) {   super.paint(g);   //int division = mouseListener.getDivision();   int division = mouseListener.getDivision();   if (division > 0){    Rectangle r = getVisibleRect();    BufferedImage image = new BufferedImage(division, r.height,      BufferedImage.TYPE_INT_ARGB);    Graphics g2 = image.getGraphics();    g2.setClip(0, 0, division, r.height);    g2.setColor(Color.WHITE);    g2.fillRect(0, 0, division, r.height);    super.paint(g2);    g.drawImage(image, r.x, r.y, division, r.height, null);    g2.dispose();   }  }

画完了固定的列的列头,我们就要画表格中的内容了,这里我们就是把这些内容画在一个JLabel上,如下:

 private class FixedColumnsDelegate extends JLabel{   public void paintComponent(Graphics g) {    Rectangle r = table.getBounds();    if (division > 0) {     table.invalidate();     table.validate();     Rectangle visibleRect = table.getVisibleRect();     BufferedImage image = new BufferedImage(division, r.height,       BufferedImage.TYPE_INT_ARGB);     Graphics g2 = image.getGraphics();     g2.setClip(0, visibleRect.y, division,   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号