以前只用過vector<Object> ,但是在做從數據庫導出數據放到jtable中時,發現還有個vector<vector<Object>>的用法。
先說jtable和DefaultTableModel
jtable本身是可以顯示一張列表,但是不能按鈕監聽的增加正行數據。
jtable中沒有addRow(Object[] rowData) 或者addRow(Vector rowData) ,方法。
但是jtable中有一個構造方法,JTable(TableModel dm)
而TableModel是一個接口,實現這個接口有一個常用的類DefaultTableModel。在DefaultTableModel中有一個方法,addRow(Object[] rowData)可以將一個一維數組的數據添加到這個table中model的結尾,同時還有一個addRow(Vector rowData)方法,可以將一個Vector集合添加到table中model的結尾。
tip:
說明為什么會有addRow(Object[] rowData)和addRow(VectorrowData)呢?
我們知道數組有個特性就是長度固定,addRow(Object[] rowData)只 能添加長度固定的一個數組數據。也就是說如果要查詢的數據的長度的未知,如果用數組就需要事先初始化數組的長度,當由於長度未知,就不得不設置的很大以至於能存儲要查詢的數據。如果數據不夠這個這個數組的長度,那么剩余的長度也會添加到中table或者table的model中,這些部分將以空白數據顯示 在table中
而vector有個特性就是長度可變,有多少數據就用多少的vector長度,不夠的自動增長為原來長度的一倍。 在向table中或model中添加數據時,就算要查詢的數據的長度未知,vector也會自動增加長度容納這些數據,不會造成空間浪費。既然 vector中沒有空白的空間,那么table中也就自然不存在空白的數據。
怎樣把數據以jtable顯示。
jtable中的數據是以二維數組的形式添加到table中的,
publicJTable(Object[][] rowData,Object[] columnNames)
前面一個參數代表數據,后面一個代表列。
如:
1 String [] title = {"學號","姓名","成績"}; 2 Object[][]o = {{"1","張三","80"},{"2","里斯","550"},{"3","王二","70"}}; 3 Jtable jt = newJTable(o,title);
這只是顯示固定的數據。如果要顯示從數據庫中查詢出來的數據, 就必然用到vector<vector<Object>>。為什么不直接用Vector<Object>,如直接把 Vector<Student>,直接加到jtable中,Student對象可以自動得到student的姓名、成績等值,加入到 jtable中??這種說看似很合理,但是,我們要知道jtable只能顯示一個數據,不會智能的顯示這個對象的各個屬性值,所以我們要把這個 Student對象的屬性值也要顯式的輸出來放到一個集合中,再放到table中。table的每行組成一個vector,每一行的數據有組成一個 vector,就需要在vector中再放一個vector,因為vector的底層也是基於數組的,所以就好像是一個二維數組,第一個vector代表 行,第二個vector代表這個行的各列數據。
在API中DefaultTableModel的一個構造方法是這樣定義的
DefaultTableModel
public DefaultTableModel(Vector data,
Vector columnNames)構造一個 DefaultTableModel,並通過將 data 和 columnNames 傳遞到 setDataVector 方法來初始化該表。
參數:
data - 表的數據,它是一個 Vector,由包含多個 Object 值的 Vector 組成(注意)
columnNames - 包含新的列名稱的 vector
比如我們有一個已經查詢好的集合Vector<Book> bookList;
在jtable中顯示這個集合
Vector<String> title = newVector<String>();// 列名 title.add("ISBN"); title.add("書名"); title.add("書類型"); title.add("單價"); Vector<Vector<Object>> data = newVector<Vector<Object>>();// for (int i = 0; i < bookList.size(); i++) { Vector<Object>v = new Vector<Object>();//里面一層的vector存放書的各個數據 Bookb = bookList.get(i); v.add(b.getIsbn()); v.add(b.getBookName()); v.add(b.getBookType()); v.add(b.getPrice()); data.add(v);//外面一層的vector data存放已經有數據的第一個vector v } DefaultTableModel model = new DefaultTableModel(data, title); table = new JTable(model){ publicboolean isCellEditable(int row,int col){ return false;}};//利用一個匿名內部類重寫這個jtable中isCellEditable方法,設置為不可編輯。
