JTable如何像excel一样固定行列,不随滚动条移动
来源:互联网 发布:时尚界的凯撒大帝知乎 编辑:程序博客网 时间:2024/05/17 19:19
转自:http://bbs.csdn.net/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.csdn.net/u/20080218/08/4d73d35f-af01-4914-b3a2-e2e2efb858c6.html
0 0
- JTable如何像excel一样固定行列,不随滚动条移动
- Excel前几行固定,不随滚动条滚动
- 层固定,不随滚动条滚动
- 固定DIV不随滚动条滚动
- 页面顶端固定div,不随滚动条移动,提示浏览器信息
- CSS jquery实现Div底部固定,不随滚动条移动
- 如何在EXCEL中拖动滚动条保持列不跟着移动?
- 移动端网页大小固定区域滚动/overflow:auto移动端不显示滚动条
- 固定div位置,不随滚动条滚动
- div固定位置,不随滚动条滚动
- CSS+DIV固定位置,不随滚动条而滚动
- 如何实现导航栏固定在某一位置不会随滚动条的移动而改变
- 网页背景不随滚动条移动
- 急求解决:如何将TodayScreen插件的宽度设为屏幕宽,就像系统自带的"日期"插件一样,不出现滚动条。
- JTextArea滚动条像QQ一样自动向下滚动
- 让层固定,不随滚动条拖动而动
- 固定div位置,不随滚动条上下动
- 如何让DIV固定在页面的某个位置而不随着滚动条随意滚动
- Report Studio 排序
- 经典数据算法试题
- thrift C++代码分析
- imageloader+gridview
- Mac 下 Chrome浏览器 50版本无法跨域的解决
- JTable如何像excel一样固定行列,不随滚动条移动
- JNI异常处理
- 全球同服架构设计
- 获取验证码倒计时
- 从TS流到PAT和PMT
- Report Studio 汇总
- 创建第一个vue应用
- MongoDB高级部分及实现(一)
- css+div布局,版心的使用(一)拉伸不会改变布局