转自:http://bbs.youkuaiyun.com/topics/200068425
JTable如何像excel一样固定行列,不随滚动条移动
我把代码贴出来给大家共享一下吧,也许有谁用得着的
只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐
原因是固定列的footer边框稍大一些造成的,谁能把这个问题解决了也行啊,不想把分就这么扔掉了
附代码,jdk1.6下通过
只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐
原因是固定列的footer边框稍大一些造成的,谁能把这个问题解决了也行啊,不想把分就这么扔掉了
附代码,jdk1.6下通过
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
);
}
}
|
固定列是行表头的思想,即将所有行的前几列固定,比较好的做法是采用两个表,与楼主列的资料类似。
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.youkuaiyun.com/u/20080218/08/4d73d35f-af01-4914-b3a2-e2e2efb858c6.html