1. 程式人生 > >實現JTable的動態更新

實現JTable的動態更新

最近有個專案需要用到JTable,於是我去查了JTable的API,知道了JTable的以下構造方法JTable(int numRows, int numColumns);這是指定行列的JTable,沒有表頭,捨棄,JTable(Object[][] rowData, Object[] columnNames);這樣的JTable不夠靈活,缺少很多方法,捨棄。
我最開始用的是JTable(TableModel dm);在構造一個DefaultTableModel,
剛開始用的是DefaultTableModel(Object[][] data, Object[] columnNames);然後主要依靠的是DefaultTableModel的setDataVector方法。我的思路是new 一個100行的二維陣列,然後放到JScrollPane上,在資料修改以後,用getValueAt獲取每一個單元格的資料,再寫入檔案,然後再從檔案讀一次,再用setDataVector方法去更新JTable上的資料。這樣就基本實現了JTable資料的動態更新。
但是這樣也有缺點,首先是介面不美觀,如果資料量少的話,介面上就會有很多空白行,這些空白行都是可以編輯的,考慮到使用者可能這這些單元格上隨便編輯,給後續的獲取資料造成影響。其次,因為二維陣列是固定長度的,這會導致資料儲存有一個極限,這無疑是很大的副作用。
後來我注意到DefaultTableModel的addRow方法和removeRow方法,在經過試驗以後,我發現這兩個方法都是實時更新的,即一使用這個方法之後,JTable上的資料都會更新,這樣我就有了一個想法——通過檔案的反覆讀寫實現JTable的行數可變和無極限。

//  mark值是用於標記是否是第一次讀取檔案
    public static void ReadFile(boolean mark) {
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
            v.clear();
            String s1[][] = new String[1][7];
            for (int i = 0; i < s1.length; i++) {
                s1[0
][i] = new String(); } // 如果是第一次讀取檔案,則new DefaultTableModel,其中s1為一個無意義的字串陣列 // 一維長度,即JTable上的行,只有1,names是一個包含各列名稱的字串陣列 if (mark) { d = new DefaultTableModel(s1, names); } else { // 如果不是第一次讀取檔案,那麼JTable上一定以有資料, // 這裡是將JTable上以顯示的每一行都刪除
// 必須從最後一行往前移除,否則無法全部移除,因為每一次移除之後,各行的行索引都會上升一位, // 這導致如果是從第0行開始移除的話,就無法全部移除 for (int i = bd.getRowCount() - 1; i >= 0; i--) { bd.removeRow(i); } // 這裡是讀取檔案,將讀取到的資料放到對應的位置,我這裡是讀寫的火車車次資訊 BufferedReader br = new BufferedReader(new FileReader(file)); while (true) { String carnum = br.readLine(); if (carnum == null) break; String startplace = br.readLine(); String endplace = br.readLine(); String starttime = br.readLine(); String endtime = br.readLine(); double price = Double.parseDouble(br.readLine()); int restnumber = Integer.parseInt(br.readLine()); String Temp1[] = { carnum, startplace, endplace, starttime, endtime, String.valueOf(price), String.valueOf(restnumber) }; Tickets temp = new Tickets(carnum, startplace, endplace, starttime, endtime, price, restnumber); // v 是一個vector集合,這是實現無限讀取的基礎 v.add(temp); // 這裡是將讀到的每一組資料加入到JTable上 d.addRow(Temp1); } br.close(); // 第一次讀取需要移除第0行的空行,就是上面的那個s1造成的空行 if (mark) { d.removeRow(0); } } catch (Exception e) { e.printStackTrace(); } }

最後的效果是
可以很明顯的看出,下面沒有可編輯的空行
可以很明顯的看出,下面沒有可編輯的空行

這樣一個可以動態更新的JTable就製作好了