JTable如何像excel一样固定行列,不随滚动条移动

转自:http://bbs.csdn.net/topics/200068425


JTable如何像excel一样固定行列,不随滚动条移动

我把代码贴出来给大家共享一下吧,也许有谁用得着的
只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐
原因是固定列的footer边框稍大一些造成的,谁能把这个问题解决了也行啊,不想把分就这么扔掉了
附代码,jdk1.6下通过
Java code ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
public  class  TestFixTable  extends  JFrame {
     private  static  final  long  serialVersionUID = 1L;
 
     Object[][] data;
 
     Object[] column;
 
     JTable fixedTable, table;
 
     public  TestFixTable() {
         super ( "Fixed Column Example" );
         setSize( 400 150 );
 
         data =  new  Object[][] { {  "1" "11" "A" "" "" "" "" ""  },
                 "2" "22" "" "B" "" "" "" ""  },
                 "3" "33" "" "" "C" "" "" ""  },
                 "4" "44" "" "" "" "D" "" ""  },
                 "5" "55" "" "" "" "" "E" ""  },
                 "6" "66" "" "" "" "" "" "F"  } };
         column =  new  Object[] {  "fixed 1" "o" "a" "b" "c" "d" "e" "f"  };
 
         AbstractTableModel fixedModel =  new  AbstractTableModel() {
             private  static  final  long  serialVersionUID = 1L;
 
             public  int  getColumnCount() {
                 return  1 ;
             }
 
             public  int  getRowCount() {
                 return  data.length;
             }
 
             public  String getColumnName( int  col) {
                 return  (String) column[col];
             }
 
             public  Object getValueAt( int  row,  int  col) {
                 return  data[row][col];
             }
         };
         AbstractTableModel model =  new  AbstractTableModel() {
             private  static  final  long  serialVersionUID = 1L;
 
             public  int  getColumnCount() {
                 return  column.length -  2 ;
             }
 
             public  int  getRowCount() {
                 return  data.length;
             }
 
             public  String getColumnName( int  col) {
                 return  (String) column[col +  1 ];
             }
 
             public  Object getValueAt( int  row,  int  col) {
                 return  data[row][col +  1 ];
             }
 
             public  void  setValueAt(Object obj,  int  row,  int  col) {
                 data[row][col +  1 ] = obj;
             }
 
             public  boolean  CellEditable( int  row,  int  col) {
                 return  true ;
             }
         };
 
         fixedTable =  new  JTable(fixedModel);
         fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
         fixedTable.getSelectionModel().addListSelectionListener(
                 new  ListSelectionListener() {
                     public  void  valueChanged(ListSelectionEvent arg0) {
                         checkSelection( true );
 
                     }
                 });
 
         table =  new  JTable(model);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
         table.getSelectionModel().addListSelectionListener(
                 new  ListSelectionListener() {
                     public  void  valueChanged(ListSelectionEvent arg0) {
                         checkSelection( false );
                     }
                 });
 
         JViewport viewport =  new  JViewport();
         viewport.setView(fixedTable);
         viewport.setPreferredSize(fixedTable.getPreferredSize());
 
         JScrollPane scroll =  new  JScrollPane(table);
         scroll.setRowHeaderView(viewport);
         scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
                 .getTableHeader());
 
         getContentPane().add(scroll, BorderLayout.CENTER);
     }
 
     private  void  checkSelection( boolean  isFixedTable) {
         int  fixedSelectedIndex = fixedTable.getSelectedRow();
         int  selectedIndex = table.getSelectedRow();
         if  (fixedSelectedIndex != selectedIndex) {
             if  (isFixedTable) {
                 table.setRowSelectionInterval(fixedSelectedIndex,
                         fixedSelectedIndex);
             else  {
                 fixedTable
                         .setRowSelectionInterval(selectedIndex, selectedIndex);
             }
         }
 
     }
 
     public  static  void  main(String[] args) {
         TestFixTable frame =  new  TestFixTable();
         frame.addWindowListener( new  WindowAdapter() {
             public  void  windowClosing(WindowEvent e) {
                 System.exit( 0 );
             }
         });
         frame.setVisible( true );
     }
}


固定列是行表头的思想,即将所有行的前几列固定,比较好的做法是采用两个表,与楼主列的资料类似。

Java code ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     
public  static  JScrollPane createAJScrollPane(JTable sideTb, int  sideViewWidth,JTable Tb){
    JScrollPane result =  new  JScrollPane(Tb);
 
    JViewport dataviewport =  new  JViewport();
 
    result.getViewport().setBackground(Color.white);
    result.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
 
    //添加左边表格
    dataviewport.setView(sideTb);
    dataviewport.setBackground(Color.white);
    dataviewport.setPreferredSize( new  Dimension(sideViewWidth,  100 ));
    result.setRowHeader(dataviewport);
    result.setCorner(JScrollPane.UPPER_LEFT_CORNER, sideTb.getTableHeader());
 
    return  result;
}


固定行是多表头的思想,网上比较多的资料是重写UI的思想,可以搜索GroupableTableHeaderUI,但这种做法存在很多问题,例如导出,或多表头个别数据的修改。前两天看到了利用layout实现的方式,可以看看: http://topic.csdn.net/u/20080218/08/4d73d35f-af01-4914-b3a2-e2e2efb858c6.html



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值