黑马程序员技术交流社区

标题: 编写自己的TableModel [打印本页]

作者: 胆小的狙击手    时间: 2016-1-13 23:40
标题: 编写自己的TableModel
java的GUI有一个组件是表格组件,该组件可以以表格的形式呈现数据,数据呈现的方式是通过一个TableModel来实现的,该TableModel负责给表格提供数据,降低了表格与数据的耦合程度,非常灵活。但是TableModel的实现类只有DefaultTableModel一种,只能通过二维数组来呈现表格内容,有时并不能满足我们的需求,这时就需要自己定义一个合适的TableModel。只需要实现TableModel或者继承DefaultTableModel即可。
实现TableModel需要实现以下几个方法
int getRowCount()   此方法返回一共有多少行数据
int getColumnCount() 此方法返回一共有多少列数据
String getColumnName(int columnIndex)此方法返回每列的列名
Class<?> getColumnClass(int columnIndex)针对列中所有的单元格值,返回最具体的超类
boolean isCellEditable(int rowIndex,                       int columnIndex)此方法设置每个单元格是否可编辑
Object getValueAt(int rowIndex,                  int columnIndex)  此方法返回指定行的指定列的值
void setValueAt(Object aValue,                int rowIndex,                int columnIndex)  此方法设置指定行,指定列的值
void addTableModelListener(TableModelListener l)  每当表格数据发生改变时,就添加到被通知的列表中
void removeTableModelListener(TableModelListener l)   移除监听器

显然直接实现TableModel需要自己实现全部的方法,这样虽然更加的灵活,但是对于初学者来说,有些方法并不好实现,所以可以选择继承DefaultTableModel,然后重写关键的方法,这样就减少了开发的难度。下面以我自己实现的一个TableModel作为例子。
public class ListTableModel<T> extends AbstractTableModel {
    private List<T> list;
    private String[] columnNames;
    private String[] propNames;
   
    /**
     * @param list    list代表表格中要填充的集合数据;
     * @param className    c代表集合数据元素的类型;
     * @param columnNames    colNames代表表格列名称;
     * @param propNames        propNames代表每列数据对应的属性名称
     */
    public ListTableModel(List<T> list, Class<?> className, String[] columnNames, String[] propNames) {
        this.list = list;
        this.columnNames = columnNames;
        this.propNames = propNames;
    }

    @Override
    /**
     * 返回行数
     */
    public int getRowCount() {
        return list == null ? 0 : list.size() < 10 ? 10 : list.size();
    }

    @Override
    /**
     * 返回列数
     */
    public int getColumnCount() {
        return columnNames == null ? 0 : columnNames.length;
    }
   
    @Override
    /**
     * 返回列名
     */
    public String getColumnName(int column) {
        return columnNames[column];
    }

    @Override
   /**
    * 最关键的方法,表格要如何显示就在于这个方法的实现
    *
    */
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (rowIndex >= list.size()) {
            return null;
        }
        
        try {
            //通过反射得到(参数1)对象的指定(参数2)字段的值
            return BeanUtils.getProperty(list.get(rowIndex), propNames[columnIndex]);
        } catch (Exception e) {
            return null;
        }
    }
   
    /**
     * 接收表格指定行号,从集合中获取行号对应的集合元素,并返回该集合元素
     * @param row
     * @return
     */
    public T getInstance (int row) {
        if (row >= list.size()) {
            return null;
        }
        return list.get(row);
    }

}








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2