网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

【JAVA】JTable学习之使用AbstractTableModel (一)

版权申明:本文出自悠然品鉴 小悠 原创,禁止伪原创抄袭,转载请注明出处: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,使用默认的数据模型、

默认的列模型和默认的选择模型对其进行初始化。

JTable(int numRows, int numColumns) 
使用 DefaultTableModel 构造具有 numRows 行

和 numColumns 列个空单元格的 JTable。

JTable(Object[][] rowData, Object[] columnNames) 

构造一个 JTable 来显示二维数组 rowData 中的值,

其列名称为 columnNames。

JTable(TableModel dm) 
构造一个 JTable,使用数据模型 dm、默认的列模型

和默认的选择模型对其进行初始化。

JTable(TableModel dm, TableColumnModel cm) 
构造一个 JTable,使用数据模型 dm、列模型 cm 

和默认的选择模型对其进行初始化。

JTable(TableModel dm, TableColumnModel cm,

 ListSelectionModel sm) 
构造一个 JTable,使用数据模型 dm、列模型 cm 

和选择模型 sm 对其进行初始化。

JTable(Vector rowData, Vector columnNames) 
构造一个 JTable 来显示 Vector 所组成的 Vector 

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



  • 标签:
  • JTable AbstractTabl
  • AbstractTabl显示控件
  • AbstractTabl显示图片
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.