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 for( int 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( 400, 300 );
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 }
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 for( int 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( 400, 300 );
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 此號已被刪 閱讀(911) 評論(0) 編輯 收藏 所屬分類: JAVA