12.11.2 TableModel和监听器

12.11.2 TableModel和监听器

JListJTree类似的是,JTable采用了TableModel来保存表格中的所有状态数据;与ListModel类似的是,TableModel也不强制保存该表格显示的数据。虽然在前面程序中看到的是直接利用一个二维数组来创建JTable对象,但也可以通过TableModel对象来创建表格

使用TableModel创建表格

如果需要利用TableModel来创建表格对象,则可以利用Swing提供的AbstractTableModel抽象类,该抽象类已经实现了TableModel接口里的大部分方法,程序只需要为该抽象类实现如下三个抽象方法即可。

  • getColumnCount():返回该TableModel对象的列数量。
  • getRowCount():返回该TableModel对象的行数量。
  • getValueAt():返回指定行、指定列的单元格值。

重写这三个方法后只是告诉JTable生成该表格所需的基本信息,如果想指定JTable生成表格的列名,还需要重写getColumnName(int c)方法,该方法返回一个字符串,该字符串将作为第c+1列的列名

设置单元格内容可修改

在默认情况下,AbstractTableModelboolean isCellEditable(int rowIndex, int columnIndex)方法返回false,表明该表格的单元格处于不可编辑状态,如果想让用户直接修改单元格的内容,则需要重写该方法,并让该方法返回true。重写该方法后,只实现了界面上单元格的可编辑,如果需要控制实际的编辑操作,还需要重写该类的void setValueAt(Object aValue, int rowIndex, int columnIndex)方法。

方法 描述
boolean isCellEditable(int rowIndex, int columnIndex) Returns false.
void setValueAt(Object aValue, int rowIndex, int columnIndex) This empty implementation is provided so users don’t have to implement this method if their data model is not editable.

TableModel典型应用 封装JDBCResultset

关于TableModel的典型应用就是用于封装JDBC编程里的Resultset,程序可以利用TableModel来封装数据库査询得到的结果集,然后使用JTable把该结果集显示岀来。还可以允许用户直接编辑表格的单元格,当用户编辑完成后,程序将用户所做的修改写入数据库。

程序

下面程序简单实现了这种功能一当用户选择了指定的数据表后,程序将显示该数据表中的全部数据,用户可以直接在该表格内修改数据表的记录

上面程序的关键在于①号粗体字代码所扩展的ResultsetTableModel类,该类继承了AbstractTableModel父类,根据其Resultset来重写getColumnCountgetRowCountgetValueAt三个方法,从而允许该表格可以将该Resultset里的所有记录显示出来。除此之外,该扩展类还重写了isCellEditabled方式用来实现允许用户编辑单元格的功能,重写了setValueAt两个方法用来实现当用户编辑单元格时将所做的修改同步到数据库的功能。
程序中的粗体字代码使用Resultset创建了一个TableModel对象,并为该TableModel添加事件监听器,然后把该TableModel使用JTable显示出来。当用户修改该JTable对应表格里单元格的内容时,该监听器会检测到这种修改,并将这种修改信息通过下面的文本域显示出来
运行上面程序,会看到如图12.50所示的界面。
从图12.50中可以看出,当修改指定单元格的记录时,添加在TableModel上的监听器就会被触发。当修改JTable单元格里的内容时,底层数据表里的记录也会做出相应的改变。

DefaultTableModel

不仅用户可以扩展AbstractTableModel抽象类,Swing本身也为AbstractTableModel提供了一个DefaultTableModel实现类,程序可以通过使用DefaultTableModel实现类来创建Table对象。通过DefaultTableModel对象创建JTable对象后,就可以调用它提供的方法来添加数据行、插入数据行、删除数据行和移动数据行
DefaultTableModel提供了如下几个方法来控制数据行操作。

DefaultTableModel控制数据行的方法 描述
addColumn() 该方法用于为TableModel增加一列,该方法有三个重载的版本,实际上该方法只是将原来隐藏的数据列显示出来。
addRow() 该方法用于为TableModel增加一行,该方法有两个重载的版本
insertRow() 该方法用于在TableModel的指定位置插入一行,该方法有两个重载的版本。
removeRow(int start, int end,int to) 该方法用于移动TableModel中指定范围的数据行

通过DefaultTableModel提供的这样几个方法,程序就可以动态地改变表格里的数据行

SwingTableModel提供了两个实现类,其中一个是DefaultTableModel,另一个是JTable的匿名内部类。

  • 如果直接使用二维数组来创建JTable对象,维护该JTable状态信息的model对象就是JTable匿名内部类的实例;
  • 当使用Vector来创建JTable对象时,维护该JTable状态信息的modl对象就是DefaultTableModel实例