版权申明:本文出自悠然品鉴 小悠 原创,禁止伪原创抄袭,转载请注明出处:http://www.youranshare.com/blog/sid/67.html
Note : 本实例中涉及到了Java中的Vector的使用,建议先了解Vector的使用方法, [不想看我白话的话,就直接跳到后面看代码与贴图,代码注释很详细]
我表示写这篇文章很纠结、、因为我是比较热衷于C++的,在Java方面的理解还不是那么的深刻,万一理解片面了,误人子弟了可不是一件好事、、、但是反正不管怎样,想想还是写了吧,给大家分享一下我的一些使用方法,一起共同进步才好嘛。
如果你问我Java中的JTable能干什么?那我就能告诉你 JTable绝对不仅仅只是用来存放文本数据的控件,在JTable表格控件中,数据 与 表格 是分开的,这个分开的意思就是:表格内的数据是单独存放的 与 JTable本身木有半毛钱关系,你之所以可以在表格内看到数据是因为 JTable 与数据之间存在的 一一映射的数据映射关系,就好比 房子 与人的关系一样,房子与人是相互独立的,但是有了房产证的关联于是乎房子就与人形成映射关系了。
在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的示例:
// //*************************************************************************** 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不仅仅是用来显示文本数据的,例如下图
时间不早了,今天先写到这里,明天来解释如何显示我们的控件….
本文出自悠然品鉴 小悠,请勿伪原创抄袭,转载请注明出处:http://www.youranshare.com/blog/sid/67.html