利用Java開發數據庫應用系統時
經常需要在用戶界面上顯示查詢結果
由於SUN公司提供的JDK
x開發工具包不是可視化的集成開發環境(IDE)
能象Delphi
VB那樣方便地把查詢結果在DBGrid等表格中顯示出來
因此
只能靠自己編寫代碼來實現
在實際應用中
我們可以利用Vector
JTable
AbstractTableModel等三個類較好地解決這一問題
以下
詳細介紹一下實現方法
一
類Vector
類JTable及類AbstractTableModel簡介
類Vector
類Vector是Java的歷史集合類
隸屬於java
util包
它包裝了異構鏈表和數組雜合體
具有以下兩個特點
(
)向量是異構的
不要求每個元素的類型相同
向量中可以混合多種對象類型
(
)向量是數組雜合體
因為它們可以在增加元素時動態增大
其異構性正好符合數據庫記錄中屬性類型不一的特點
而其動態性也正好符合數據庫查詢時
結果集記錄個數不定的特點
類Vector定義如下
public class Vector extends AbstractList
implements List
Cloneable
Serializable{…}
實現了向量成員的查找
新增
刪除等方法
如
add(Object obj)可方便地加入一個對象
get(int index)可方便地得到向量中的一個對象
remove(Object obj)則可方便地刪除向量中一個對象
類JTable
JTable組件是Swing組件中比較復雜的小件
隸屬於javax
swing包
它能以二維表的形式顯示數據
類JTable定義如下
public class JTable extends JComponent
implements TableModelListener
Scrollable
TableColumnModelListener
ListSelectionListener
CellEditorListener
Accessible{…}
類JTable在顯示數據時具有以下特點
(
)可定制性
可以定制數據的顯示方式和編輯狀態
(
)異構性
可以顯示不同類型的數據對象
甚至包括顏色
圖標等復雜對象
(
)簡便性
可以以缺省方式輕松地建立起一個二維表
其可定制性可滿足不同用戶和場合的要求
異構性也正好符合數據庫訪問結果集中屬性類型不一的特點
類JTable提供了極為豐富的二維表格操作方法
如設置編輯狀態
顯示方式
選擇行列等
在此不一一贅述
使用類JTable顯示數據之前
必須根據情況生成定制模型
單元繪制器或單元編輯器
類AbstractListModel用來定制用戶自己的數據模型
這個類在後面要介紹
TableCellRenderer接口用來定制單元繪制器
TableCellEditor接口用來定制單元編輯器
這兩個接口主要用於顏色對象的處理上
在示例中沒有用到
不做過多說明
類AbstractTableModel
類AbstractTableModel是一個抽象類
沒有完全實現
不能實例化
使用時必須在程序中實現方法
它隸屬於javax
swing
table
類定義如下
public abstract class AbstractTableModel extends Object
implements TableModel
Serializable{…}
類AbstractTableModel提供了TableModel接口中絕大多數方法的缺省實現
TableModel接口定義了JTable 的基礎數據結構
用戶要生成自己的數據模型
本來可以通過實現TableModel接口中所有方法來滿足要求
但管理聽眾表的功能對於所有數據模型是共同的
所以在javax
swing
table中又定義了類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
數據庫名為
worker
dbf
具有以下字段
字段名 類型
Wno(職工號) VARCHAR
Wname(職工名) VARCHAR
Sex(性別) VARCHAR
Birthday(出生日期) DATE
Wage(工資) FLOAT
要連接此數據庫
需使用java
sql包中的類DriverManager
此類是用於管理JDBC驅動程序的實用程序類
它提供了通過驅動程序取得連接
注冊
撤消驅動程序
設置登記和數據庫訪問登錄超時等方法
具體連接方法如下
第一步
定位
裝入和鏈接SybDriver類
driver=
com
sybase
jdbc
SybDriver
;
SybDriver sybdriver=(SybDriver)
Class
forName(driver)
newInstance();
第二步
注冊SybDriver類
DriverManager
registerDriver(sybdriver);
第三步
取得連接(SybConnection)對象引用
user=
sa
;
password=
;
url=
jdbc:sybase:Tds:
:
/WORKER
;
SybConnection connection=
(SybConnection)DriverManager
getConnection (url
user
password);
建立完連接後
即可通過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 title
length;}//取得表格列數
public int getRowCount(){
return vect
size();}//取得表格行數
public Object getValueAt(int row
int column){
if(!vect
isEmpty())
return
((Vector)vect
elementAt(row))
elementAt(column);
else
return null;}//取得單元格中的屬性值
public String getColumnName(int column){
return title[column];}//設置表格列名
public void setValueAt
(Object value
int row
int column){}
//數據模型不可編輯
該方法設置為空
public Class getColumnClass(int c){
return getValueAt(
c)
getClass();
}//取得列所屬對象類
public boolean isCellEditable(int row
int column){
return false;}//設置單元格不可編輯
為缺省實現
};
定制表格
jg_table=new JTable(tm);//生成自己的數據模型
jg_table
setToolTipText(
顯示全部查詢結果
);
//設置幫助提示
jg_table
setAutoResizeMode(JTable
AUTO_RESIZE_OFF);
//設置表格調整尺寸模式
jg_table
setCellSelectionEnabled(false);
//設置單元格選擇方式
jg_table
setShowVerticalLines(true);//
設置是否顯示單元格間的分割線
jg_table
setShowHorizontalLines(true);
jsp=new JScrollPane(jg_table);//給表格加上滾動槓
第三步
顯示查詢結果
連接數據庫
第二部分已給出
數據庫查詢
Statement stmt=connection
createStatement();
ResultSet rs=stmt
executeQuery
(
select * from worker
);
顯示查詢結果
vect
removeAllElements();//初始化向量對象
tm
fireTableStructureChanged();//更新表格內容
while(rs
next()){
Vector rec_vector=new Vector();
//從結果集中取數據放入向量rec_vector中
rec_vector
addElement(rs
getString(
));
rec_vector
addElement(rs
getString(
));
rec_vector
addElement(rs
getString(
));
rec_vector
addElement(rs
getDate(
));
rec_vector
addElement(new Float(rs
getFloat(
)));
vect
addElement(rec_vector);
//向量rec_vector加入向量vect中
}
tm
fireTableStructureChanged();
//更新表格
顯示向量vect的內容
若要實現示圖中記錄前翻
後翻的效果
有兩種方法
一
如果軟件環境支持JDBC
可直接利用rs
prevoius()和rs
next()獲得記錄
然後通過類JTextField中的setText()方法
顯示出各個字段值
二
如果不支持JDBC
則可利用向量Vector按行取出JTable中數據
自定義一個指針
用來記錄位置
當指針加
時
取出上一行數據放入Vector中顯示
指針減
時
取出下一行數據顯示
顯示方法同上
需要說明的是
代碼中沒有給出捕捉例外的部分
如SQLException
實際應用中必須給出
此外
有些系統中
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26092.html