潘國榮
摘要:JTable是Java Swing開發(fā)工具包中的表格組件。該文介紹了通過定義一個(gè)自定義表格模型來構(gòu)造和使用表格的方法。
關(guān)鍵詞:Java;表格;表格模型
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2012)15-3583-03
Research on Implementation Method of Table Based on Custom Table Model in Java
PAN Guo-rong
(Chang Zhou Liu Guo-jun Higher Vocational and Technical School, Changzhou 213025, China)
Abstract:Jtable is the table componets of Java Swing development kit. This paper discusses the method of constructing and using tables by defining a custom model.
Key words: Java; table; table model
因Java程序設(shè)計(jì)語言具有強(qiáng)大的功能,正越來越多地被軟件開發(fā)人員所使用。使用Java既可以編寫基于Windows的圖形用戶界面GUI程序,也可以編寫在Internet網(wǎng)絡(luò)環(huán)境下運(yùn)行的Web應(yīng)用程序?,F(xiàn)在編寫GUI程序主要使用Swing開發(fā)工具包,它以抽象窗口工具包(AWT)為基礎(chǔ)使跨平臺應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格。如果要在程序界面中顯示大量數(shù)據(jù),并且經(jīng)常和數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行交互,可以使用Swing開發(fā)工具包中的表格JTable組件,該組件是較為復(fù)雜的組件之一。
JTable組件控制數(shù)據(jù)的顯示方式,但JTable組件中存儲的數(shù)據(jù)是由表格模型決定的,因此在我們創(chuàng)建JTable組件前,應(yīng)先創(chuàng)建一個(gè)表格模型。Swing開發(fā)工具包中提供了好幾種表格模型類,如DefaultTableModel、AbstractTableModel,但直接使用它們來構(gòu)造表格還顯得不太方便和靈活,通??梢宰约憾x一個(gè)模型類來構(gòu)造表格。
1自定義表格模型的定義
可以將Swing中提供的抽象表格模型類AbstractTableModel作為基類,派生出一個(gè)表格模型類,在該類中,重新定義了構(gòu)造方法以及向表格中添加數(shù)據(jù)行的方法、刪除表格中數(shù)據(jù)行的方法、設(shè)置和讀取表格單元格中數(shù)據(jù)的方法及獲取表格中行數(shù)的方法等,通過設(shè)計(jì)這些方法,大大方便了對表格中數(shù)據(jù)的操縱。
自定義表格模型類MyTableModel.java的定義如下:
import java.util.*;
import java.sql.*;
import javax.swing.table.*;
import javax.swing.*;
public class MyTableModel extends AbstractTableModel
{ private Vector content=null; //存放表格數(shù)據(jù)的Vector
private String[] title_name; //存放表格標(biāo)題的數(shù)組
private int colCnt; //表格中的列數(shù)
private int colSt,colEnd; //可以編輯列的起止索引號
//構(gòu)造方法
public MyTableModel(String[] title_name,int n)
{this.title_name=new String[n];
colCnt=n;
for(int i=0;i { this.title_name[i]=new String(); this.title_name[i]=title_name[i]; } content=new Vector(); } //添加一行,數(shù)據(jù)行存放在Vector類型的row public void addRow(Vector row) {content.add(row); } //添加多行,數(shù)據(jù)行存放在rows中,rows中每一個(gè)對象是一個(gè)Vector類型的row public void addRows(Vector rows) {for(int i=0;i { content.add(rows.get(i)); } } //刪除一行 public void removeRow(int row) {content.remove(row); } //刪除所有行,全部刪除 public void removeRows(int row,int count) {for(int i=0;i { if(content.size()>row) { content.remove(row); } } } //獲取行數(shù) public int getRowCount(){return content.size();} //獲取某一單元格的值 public Object getValueAt(int row,int col) {return ((Vector)content.get(row)).get(col);} //更新表格中某一單元格的值 public void setValueAt(Object value,int row,int col) {((Vector)content.get(row)).remove(col); ((Vector)content.get(row)).add(col,value); this.fireTableCellUpdated(row,col); } //設(shè)定可編輯列的起止范圍,從colSt到colEnd public void setColumnEditable(int colSt,int colEnd) {this.colSt=colSt; this.colEnd=colEnd; } //決定表格中哪些單元格的值可以修改,返回false表示不能修改 public boolean isCellEditable(int rowIndex,int columnIndex) { //序列號不能修改 if(columnIndex>=colSt && columnIndex<=colEnd) { return true; } return false; } //獲取列名 public String getColumnName(int col) { return title_name[col]; } //獲取列數(shù) public int getColumnCount() { return title_name.length; } } 2自定義表格模型的使用 表格模型定義好后,要使用表格就比較方便了。下面通過從數(shù)據(jù)庫學(xué)生情況表(學(xué)號:ssno,姓名:ssname,性別:ssex,備注:ss? note)中將數(shù)據(jù)取至表格中來說明其主要步驟。 2.1定義表格標(biāo)題String數(shù)組、JTable組件對象、及自定義表格模型MyTableModel的對象 String[] heads={"序號","學(xué)號","姓名","性別","備注"}; JTable table ; MyTableModel model; 2.2生成JTable組件對象、自定義表格模型MyTableModel的對象 model=new MyTableModel(heads,5); table=new JTable(model); p.add(new JScrollPane(table)); 2.3從數(shù)據(jù)庫中查詢數(shù)據(jù),將數(shù)據(jù)填充至表格中 Vector row; Vector rows=new Vector(); int i=1; try { Statement stat=ScoreMis.con.createStatement(); // ScoreMis為主類 ResultSet result=stat.executeQuery("select * from sstudent where left(ssno,4)="+cursc+" order by ssno");// cursc為代表當(dāng)前班級的成員變量 while(result.next()) {row=new Vector(); row.add(String.valueOf(i++)); row.add(result.getString("ssno")); row.add(result.getString("ssname")); row.add(result.getString("ssex")); row.add(result.getString("ssnote")); rows.add(row); } model.addRows(rows); model.fireTableDataChanged();} catch(SQLException e2) { JOptionPane.showMessageDialog(this, "操作數(shù)據(jù)庫出錯(cuò):"+e2); } catch(Exception e3) { JOptionPane.showMessageDialog(this, "出現(xiàn)其他錯(cuò)誤:"+e3); } 3結(jié)束語 通過上述例程代碼可以看出,在使用了自定義表格模型后,表格的構(gòu)造和表格中數(shù)據(jù)的填充就顯得非常方便了,并且可以通過調(diào)用表格模型中的相關(guān)方法來對表格中的數(shù)據(jù)進(jìn)行處理,這大大降低了初學(xué)者學(xué)習(xí)使用表格組件的難度,也可以程序提高開發(fā)人員的工作效率。 參考文獻(xiàn): [1]肖孟強(qiáng),張忠義.Java程序設(shè)計(jì)基礎(chǔ)[M].北京:人民郵電出版社,2003. [2]李鐘尉,陳丹丹.Java項(xiàng)目開發(fā)案例全程實(shí)錄[M].北京:清華大學(xué)出版社,2011.