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);
}
}
|
|