转自:http://www.youranshare.com/blog/sid/67.html
在Java中 JTable的数据是以TableModel表模式的方式存放的,这个TableModel就是用来存放数据的,当Table初始化的时候通过TableModel获取表格的 行数、列数、列标题、以及每个单元格存放的数据(至于他们之间是怎样关联起来的这里我们不做讨论),于是当表格现实的时候就可以显示出对应的数据了。
首先,我们先来看一下 JTable的构造方法:
构造方法摘要 |
JTable() 默认的列模型和默认的选择模型对其进行初始化。 |
JTable(int numRows, int numColumns) 和 numColumns 列个空单元格的 JTable。 |
JTable(Object[][] rowData, Object[] columnNames) 构造一个 JTable 来显示二维数组 rowData 中的值, 其列名称为 columnNames。 |
JTable(TableModel dm) 和默认的选择模型对其进行初始化。 |
JTable(TableModel dm, TableColumnModel cm) 和默认的选择模型对其进行初始化。 |
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) 和选择模型 sm 对其进行初始化。 |
JTable(Vector rowData, Vector columnNames) rowData 中的值,其列名称为 columnNames。 |
从构造函数中我们可以看到 JTable 要么使用了默认的数据模型,要么是构造参数中传递了数据
这里我们着重看构造函数
JTable(TableModel dm)
构造一个 JTable,使用数据模型 dm、默认的列模型和默认的选择模型对其进行初始化。
在这个构造函数中,需要传递一个数据模TableModel 用来存放数据,当表格现显示的时候就直接通过这个TableModel来获取表格的信息以及数据,我们查看API可以知道 TableMode是一个接口,需要实现AbstractTableModel的方法,而AbstractTableModel又是一个抽象的类,也就是说 在使用自己的TableModel的时候要重写一个自己的TableMode类,通过这个Model来控制自己表格的数据,查看API可以知道 AbstractTableModel中有些方法是已经实现的了,所以我们只需要对自己需要的方法进行重写:
先看一下 AbstractTableModel的基本方法
int | getColumnCount() 返回该模型中的列数。 |
String | getColumnName(int columnIndex) 返回 columnIndex 位置的列的名称。 |
int | getRowCount() 返回该模型中的行数。 |
Object | getValueAt(int rowIndex,int columnIndex) 返回 columnIndex 和 rowIndex 位置的单元格值。 |
boolean | isCellEditable(int rowIndex,int columnIndex) 如果 rowIndex 和 columnIndex 位置的单元格是可编辑的,则返回 true。就是设置当前位置的单元格的数据是否可以被编辑 |
void | setValueAt(Object aValue, int rowIndex, int columnIndex) 将 columnIndex 和 rowIndex 位置的单元格中的值设置为 aValue。 |
看了API的一些基本的方法,这里我们就通过这些基本的 方法来写一个基本的TableModel
PS :
表格既然是一个二维的,那么表格的数据存放如果也是二维的,那么数据的一一映射就很容易实现了
我们知道Vector是一个 一维线性表,存放的数据类型是Object(Java所有类的'爹'),那么如果我们在 一维的线性表中的每个位置都放一个一维的线性表,那么 就像把很多条直线 并排放一样 就变成了一个二维的空间了
下面是一个Model的示例:
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
|
//
//***************************************************************************
class
ModelDemo
extends
AbstractTableModel
{ /** *
@author
小悠 */
private
Vector TableData;
//用来存放表格数据的线性表
private
Vector TableTitle;
//表格的 列标题
//注意构造函数是第一个执行的,用于初始化 TableData,TableTitle
public
ModelDemo()
{
//先new 一下
TableData =
new
Vector();
TableTitle=
new
Vector();
//这里我们假设当前的表格是 3x3的
//先初始化 列标题,有3列
TableTitle.add(
"第一列"
);
TableTitle.add(
"第二列"
);
TableTitle.add(
"第三列"
);
//初始化3行数据,方便起见直接用String数组保存每一行的数据
//第0行,都显示表格的坐标
String []Line1 = {
"(0,0)"
,
"(0,1)"
,
"(0,2)"
};
//第1行
String []Line2 = {
"(1,0)"
,
"(1,1)"
,
"(1,2)"
};
//第2行
String []Line3 = {
"(2,0)"
,
"(2,1)"
,
"(2,2)"
};
//将数据挂到线性表形成二维的数据表,形成映射
TableData.add(Line1);
TableData.add(Line2);
TableData.add(Line3);
}
@Override
public
int
getRowCount()
{
//这里是告知表格应该有多少行,我们返回TableData上挂的String数组个数
return
TableData.size();
}
@Override
public
int
getColumnCount()
{
//告知列数,用标题数组的大小,这样表格就是TableData.size()行,TableTitle.size()列了
return
TableTitle.size();
}
@Override
public
Object getValueAt(
int
rowIndex,
int
columnIndex)
{
//获取了表格的大小,当然还要获取数据,根据坐标直接返回对应的数据
//小心 都是从 0开始的,小心下标越界 的问题
//我们之前是将 String[]挂到了线性表上,所以要先获取到String[]
//
//获取每一行对应的String[]数组
String LineTemp[] = (String[])
this
.TableData.get(rowIndex);
//提取出对 应的数据
return
LineTemp[columnIndex];
//如果我们是将 线性表Vector挂到了Vector上要注意每次我们获取的是 一行线性表
//例如
//return ((Vector)TableData.get(rowIndex)).get(columnIndex);
}
@Override
public
boolean
isCellEditable(
int
rowIndex,
int
columnIndex)
{
//这个函数式设置每个单元格的编辑属性的
//这个函数AbstractTableModel已经实现,默认的是 不允许编辑状态
//这里我们设置为允许编辑状态
return
true
;
//super.isCellEditable(rowIndex, columnIndex);
}
@Override
public
void
setValueAt(Object aValue,
int
rowIndex,
int
columnIndex)
{
//当单元格的数据发生改变的时候掉用该函数重设单元格的数据
//我们想一下,数据是放在TableData 中的,说白了修改数据就是修改的
//TableData中的数据,所以我们仅仅在此处将TableData的对应数据修改即可
((String[])
this
.TableData.get(rowIndex))[columnIndex]=(String)aValue;
super
.setValueAt(aValue, rowIndex, columnIndex);
//
//其实这里super的方法是调用了fireTableCellUpdated()只对应更新了
//对应单元格的数据
//fireTableCellUpdated(rowIndex, columnIndex);
}
}
//创建一个Dialog显示一下
public
class
JMain
{
public
static
void
main(String[] args)
{ ModelDemo myModel=
new
ModelDemo();
JTable table =
new
JTable(myModel);
JScrollPane scrollpane =
new
JScrollPane(table);
JFrame jf =
new
JFrame();
JScrollPane jsp =
new
JScrollPane(table);
jf.add(jsp);
jf.setBounds(
0
,
0
,
500
,
500
);
jf.setVisible(
true
);
}
}
|
//*****************************************下面是效果截图
//没有修改数据的时候
//修改了数据
PS:
上面说所的都是针对 普通的文本数据,当然JTable不仅仅是用来显示文本数据的,例如下图
时间不早了,今天先写到这里,明天来解释如何显示我们的控件….