JAVA JTable的使用

  转自:http://www.youranshare.com/blog/sid/67.html



在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的示例:

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不仅仅是用来显示文本数据的,例如下图

 

时间不早了,今天先写到这里,明天来解释如何显示我们的控件….

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值