利用Java开发数据库应用系统时经常需要在用户界面上显示查询结果由于SUN公司提供的JDKx开发工具包不是可视化的集成开发环境(IDE)能象DelphiVB那样方便地把查询结果在DBGrid等表格中显示出来因此只能靠自己编写代码来实现
在实际应用中我们可以利用VectorJTableAbstractTableModel等三个类较好地解决这一问题以下详细介绍一下实现方法
一类Vector类JTable及类AbstractTableModel简介
类Vector
类Vector是Java的历史集合类隶属于javautil包它包装了异构链表和数组杂合体具有以下两个特点
()向量是异构的不要求每个元素的类型相同向量中可以混合多种对象类型
()向量是数组杂合体因为它们可以在增加元素时动态增大
其异构性正好符合数据库记录中属性类型不一的特点而其动态性也正好符合数据库查询时结果集记录个数不定的特点
类Vector定义如下
public class Vector extends AbstractList
implements List Cloneable Serializable{…}
实现了向量成员的查找新增删除等方法如add(Object obj)可方便地加入一个对象get(int index)可方便地得到向量中的一个对象remove(Object obj)则可方便地删除向量中一个对象
类JTable
JTable组件是Swing组件中比较复杂的小件隶属于javaxswing包它能以二维表的形式显示数据类JTable定义如下
public class JTable extends JComponent
implements TableModelListener
Scrollable TableColumnModelListener
ListSelectionListener
CellEditorListener Accessible{…}
类JTable在显示数据时具有以下特点
()可定制性可以定制数据的显示方式和编辑状态
()异构性可以显示不同类型的数据对象甚至包括颜色图标等复杂对象
()简便性可以以缺省方式轻松地建立起一个二维表
其可定制性可满足不同用户和场合的要求异构性也正好符合数据库访问结果集中属性类型不一的特点类JTable提供了极为丰富的二维表格操作方法如设置编辑状态显示方式选择行列等在此不一一赘述
使用类JTable显示数据之前必须根据情况生成定制模型单元绘制器或单元编辑器类AbstractListModel用来定制用户自己的数据模型这个类在后面要介绍TableCellRenderer接口用来定制单元绘制器TableCellEditor接口用来定制单元编辑器这两个接口主要用于颜色对象的处理上在示例中没有用到不做过多说明
类AbstractTableModel
类AbstractTableModel是一个抽象类没有完全实现不能实例化使用时必须在程序中实现方法它隶属于javaxswingtable 类定义如下
public abstract class AbstractTableModel extends Object
implements TableModel Serializable{…}
类AbstractTableModel提供了TableModel接口中绝大多数方法的缺省实现TableModel接口定义了JTable 的基础数据结构用户要生成自己的数据模型本来可以通过实现TableModel接口中所有方法来满足要求但管理听众表的功能对于所有数据模型是共同的所以在javaxswingtable中又定义了类AbstractTableModel来处理这个工作它既管理听众表又为生成TableModelEvents事件并委托给听众提供了便利
要想生成一个具体的TableModel作为AbstractTableMode的子类至少必须实现下面三个方法
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row int column);
至此我们可以建立一个简单二维表(×)实现方法如下TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() { return ; }
public int getRowCount() { return ;}
public Object getValueAt(int row int col)
{ return new Integer(row*col); }
};
JTable table = new JTable(dataModel);
JScrollPane scrollpane = new JScrollPane(table);
二数据库及其连接方法简介
示例采用Sybase数据库系统数据库存放在数据库服务器中路径为D:\WORKER数据库名为workerdbf具有以下字段
字段名 类型
Wno(职工号) VARCHAR
Wname(职工名) VARCHAR
Sex(性别) VARCHAR
Birthday(出生日期) DATE
Wage(工资) FLOAT
要连接此数据库需使用javasql包中的类DriverManager此类是用于管理JDBC驱动程序的实用程序类它提供了通过驱动程序取得连接注册撤消驱动程序设置登记和数据库访问登录超时等方法具体连接方法如下
第一步定位装入和链接SybDriver类driver=comsybasejdbcSybDriver;
SybDriver sybdriver=(SybDriver)
ClassforName(driver)newInstance();
第二步注册SybDriver类
DriverManagerregisterDriver(sybdriver);
第三步取得连接(SybConnection)对象引用
user=sa;
password=;
url=jdbc:sybase:Tds::/WORKER;
SybConnection connection=
(SybConnection)DriverManagergetConnection (urluserpassword);
建立完连接后即可通过Statement接口进行数据库的查询与更改 三实现方法
限于篇幅在此只给出核心代码包引入界面处理变量定义等部分不再介绍第一步对象声明
AbstractTableModel tm;
//声明一个类AbstractTableModel对象
JTable jg_table;//声明一个类JTable对象
Vector vect;//声明一个向量对象
JScrollPane jsp;//声明一个滚动槓对象
String title[]={职工号职工名
性别出生日期工资};
//二维表列名
第二步定制表格
实现抽象类AbstractTableModel对象tm中的方法
vect=new Vector();//实例化向量
tm=new AbstractTableModel(){
public int getColumnCount(){
return titlelength;}//取得表格列数
public int getRowCount(){
return vectsize();}//取得表格行数
public Object getValueAt(int rowint column){
if(!vectisEmpty())
return
((Vector)vectelementAt(row))elementAt(column);
else
return null;}//取得单元格中的属性值
public String getColumnName(int column){
return title[column];}//设置表格列名
public void setValueAt
(Object valueint rowint column){}
//数据模型不可编辑该方法设置为空
public Class getColumnClass(int c){
return getValueAt(c)getClass();
}//取得列所属对象类
public boolean isCellEditable(int rowint column){
return false;}//设置单元格不可编辑为缺省实现
};
定制表格
jg_table=new JTable(tm);//生成自己的数据模型
jg_tablesetToolTipText(显示全部查询结果);
//设置帮助提示
jg_tablesetAutoResizeMode(JTableAUTO_RESIZE_OFF);
//设置表格调整尺寸模式
jg_tablesetCellSelectionEnabled(false);
//设置单元格选择方式
jg_tablesetShowVerticalLines(true);//
设置是否显示单元格间的分割线
jg_tablesetShowHorizontalLines(true);
jsp=new JScrollPane(jg_table);//给表格加上滚动槓
第三步显示查询结果
连接数据库第二部分已给出
数据库查询
Statement stmt=connectioncreateStatement();
ResultSet rs=stmtexecuteQuery
(select * from worker);
显示查询结果
vectremoveAllElements();//初始化向量对象
tmfireTableStructureChanged();//更新表格内容
while(rsnext()){
Vector rec_vector=new Vector();
//从结果集中取数据放入向量rec_vector中
rec_vectoraddElement(rsgetString());
rec_vectoraddElement(rsgetString());
rec_vectoraddElement(rsgetString());
rec_vectoraddElement(rsgetDate());
rec_vectoraddElement(new Float(rsgetFloat()));
vectaddElement(rec_vector);
//向量rec_vector加入向量vect中
}
tmfireTableStructureChanged();
//更新表格显示向量vect的内容
若要实现示图中记录前翻后翻的效果有两种方法
一如果软件环境支持JDBC可直接利用rsprevoius()和rsnext()获得记录然后通过类JTextField中的setText()方法显示出各个字段值
二如果不支持JDBC则可利用向量Vector按行取出JTable中数据自定义一个指针用来记录位置当指针加时取出上一行数据放入Vector中显示指针减时取出下一行数据显示显示方法同上
需要说明的是代码中没有给出捕捉例外的部分如SQLException实际应用中必须给出此外有些系统中