Natural

 

JTable监听列宽变动

最近遇到个关于JTable列宽变动的需求:拖动改变JTable某一列的宽度后需要做一些业务处理。

JTable的ColumnModel有个监听列模型的方法(TableColumnModelListener),但这个是拖动时响应,且拿不到列信息,这不符合我想要的。

那只能从鼠标事件的语义去分析了,在拖动列的响应事件中判断是否是目标列,在结束拖动时鼠标的释放事件中去完成业务工作。

查看了下JTable的API,可以给JTableHeader加上鼠标监听。

下面代码即监听“C2”列的demo:

 1 public class JTableTest extends JFrame{
 2     JScrollPane sp1 = new JScrollPane();
 3     JTable table = new JTable();
 4     DefaultTableModel tm = new DefaultTableModel();
 5     enum ColumnName {
 6         C1,C2,C3
 7     }
 8 
 9     void doSomething(){
10         int colNum = tm.getColumnCount();
11         forint i = 0; i < colNum; i++ ){
12             if( ColumnName.C2.name().equals( table.getColumnName( i ) ) ){
13                 TableColumn tc = table.getColumnModel().getColumn( i );
14                 System.out.println( "width: " + tc.getWidth() );
15                 // TODO : do something what you wanna 
16             }
17         }
18     }
19 
20     public JTableTest(){
21         this.setSize( 400300 );
22         this.getContentPane().add( sp1, BorderLayout.CENTER );
23         sp1.getViewport().add( table );
24         for( ColumnName col : ColumnName.values() ){
25             tm.addColumn( col );
26         }
27         table.setModel( tm );
28         class ChangedColumn{
29             boolean changed = false;
30             boolean isChanged(){
31                 return changed;
32             }
33             void setChanged( boolean changed ){
34                 this.changed = changed;
35             }
36         }
37         final ChangedColumn c2 = new ChangedColumn();
38         table.getTableHeader().addMouseListener( new MouseListener(){
39             @Override
40             public void mouseReleased( MouseEvent e ){
41                 System.out.println( "released" );
42                 if( c2.isChanged() ){
43                     doSomething();
44                     c2.setChanged( false );
45                 }
46             }
47             @Override
48             public void mousePressed( MouseEvent e ){}
49             @Override
50             public void mouseExited( MouseEvent e ){}
51             @Override
52             public void mouseEntered( MouseEvent e ){}
53             @Override
54             public void mouseClicked( MouseEvent e ){}
55         } );
56         table.getTableHeader().addMouseMotionListener(    new MouseMotionListener(){
57             @Override
58             public void mouseMoved( MouseEvent e ){}
59             @Override
60             public void mouseDragged( MouseEvent e ){
61                 System.out.println( "dragging" );
62                 TableColumn changedColumn = ( (JTableHeader)e.getSource() ).getResizingColumn();
63                 if( changedColumn != null 
64                         && ColumnName.C2.name().equals( changedColumn.getHeaderValue() ) ){
65                     c2.setChanged( true );
66                 }
67             }
68         } );
69         addWindowListener( new WindowAdapter(){
70             public void windowClosing( WindowEvent e ){
71                 System.exit( 0 );
72             }
73         } );
74         setVisible( true );
75     }
76 
77     public static void main( String[] args ){
78         new JTableTest();
79     }
80 }

posted on 2012-10-15 11:15 此号已被删 阅读(879) 评论(0)  编辑  收藏 所属分类: JAVA


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(8)

随笔分类(83)

随笔档案(78)

文章档案(2)

相册

收藏夹(7)

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜