之前只用過vector<Object> ,可是在作從數據庫導出數據放到jtable中時,發現還有個vector<vector<Object>>的用法。數據庫
先說jtable和DefaultTableModel數組
jtable自己是能夠顯示一張列表,可是不能按鈕監聽的增長正行數據。spa
jtable中沒有addRow(Object[] rowData) 或者addRow(Vector rowData) ,方法。code
可是jtable中有一個構造方法,JTable(TableModel dm)對象
而TableModel是一個接口,實現這個接口有一個經常使用的類DefaultTableModel。在DefaultTableModel中有一個方法,addRow(Object[] rowData)能夠將一個一維數組的數據添加到這個table中model的結尾,同時還有一個addRow(Vector rowData)方法,能夠將一個Vector集合添加到table中model的結尾。blog
tip:接口
說明爲何會有addRow(Object[] rowData)和addRow(VectorrowData)呢?ip
咱們知道數組有個特性就是長度固定,addRow(Object[] rowData)只 能添加長度固定的一個數組數據。也就是說若是要查詢的數據的長度的未知,若是用數組就須要事先初始化數組的長度,當因爲長度未知,就不得不設置的很大以致於能存儲要查詢的數據。若是數據不夠這個這個數組的長度,那麼剩餘的長度也會添加到中table或者table的model中,這些部分將以空白數據顯示 在table中get
而vector有個特性就是長度可變,有多少數據就用多少的vector長度,不夠的自動增加爲原來長度的一倍。 在向table中或model中添加數據時,就算要查詢的數據的長度未知,vector也會自動增長長度容納這些數據,不會形成空間浪費。既然 vector中沒有空白的空間,那麼table中也就天然不存在空白的數據。it
怎樣把數據以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方法,設置爲不可編輯。