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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JTableExcel 图表是常被用在网格或表格中显示数据。通常,用户希望输入到 JTable 的数据已经存在于 Excel 电子表格中。Excel 格式使用在非 Excel 软件中来实现导入-导出功能。因为如此,Java 软件也应该提供通用的剪贴板功能,例如在 JTableExcel 间复制和粘贴。本文展示了如何使用系统粘贴板在 Java 程序和 Excel 间复制数据。使用这一 Java 技巧中提供的适配器类,只需一行代码即可添加在 JTables 和 Excel 间复制和粘贴信息的功能。请注意,由于未签名的 applet 不能使用系统剪贴板,此功能不适用于这些 Java 程序。 当今很多业务应用程序都是使用 Java 开发的,并且以后这种用 Java 开发的应用会更多。而在许多应用程序都使用了 Swing 的 JTable 组件,以类似电子表格的格式显示数据。如果业务应用程序可以将数据导入 Microsoft Excel 和从 Microsoft Excel导出数据,则会为用户带来方便,使用户可以使用无处不在的该电子表格程序的强大功能。此 Java 技巧将帮助您理解系统剪贴板,并使您的 JTable 能够与 Excel 交互和互操作。您将看到,通过在当前应用程序中仅仅添加另外的一行代码即可实现这一有用功能的添加。 要实现这一目标,需要做的只是复制这里给出的文件 ExcelAdapter.java,对其进行编译,并确保您的应用程序可以找到 ExcelAdapter.class 文件;做完后,JTable 就可以与 Excel 进行通话了!我们将向您展示仅通过这一行代码,如何实现到 Excel 的复制 (Ctrl+C) 和粘贴 (Ctrl+V) 以及从 Excel 进行的复制和粘贴。另外还提供了一个使用 ExcelAdapter 的示例应用程序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值