Bootstrap

实现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就制作好了

;