实现JTable的动态更新

来源:互联网 发布:东安格利亚大学知乎 编辑:程序博客网 时间:2024/06/10 04:56

最近有个项目需要用到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就制作好了

0 0
原创粉丝点击