自定义TableModel
Swing提供了一个默认的TableModel——DefaultTableModel,它可以提供比较通用的数据设置功能,可以将表格内容放到一个二维数据或Vecor中作为参数传入,一个一维数据作为表头列名,方法如下:
public void setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
public void setDataVector(Vector dataVector, Vector columnIdentifiers)
但是有时候这种方式使用起来并不方便,需要将数据转换成二维数据后才可以使用,比如一个我从数据库中查找到一个List<Student>集合,就要将所有Student遍历,并将Student对象的每个字段放到二维数据中。此时我们可以自定义一个TableModel。JavaAPI中提供一个AbstractTableModel抽象类,它为我们实现了大部分功能,我们只需要实现我们关心的部分即可,假设我们的TableModel类名为StudentTableModel
public class StudentTableModel extends AbstractTableModel{
private List<Student> students;//数据集合,即需要展示的数据集
public StudentTableModel(List<Student> list){//构造方法,在创建对象时就将数据传入
this.students = list;
}
@Override
public int getRowCount() {//行数,即数据集合List的大小
return this.students.size();
}
@Override
public int getColumnCount() {
return 4;//列数,固定值,即Student类有几个字段就有几列
}
//这个方法是关键,给定行号及列号,返回一个元素。我们以List的下标为行号,列号对应Student的不同字段
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return rowIndex+1+"";
case 1:
return this.students.get(rowIndex).getStudentNo();
case 2:
return this.students.get(rowIndex).getStudentName();
case 3:
return this.students.get(rowIndex).getEmailAddress();
default:
return "-";
}
}
//列名,给定列号,返回列名
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "序号";
case 1:
return "学号";
case 2:
return "姓名";
case 3:
return "邮箱地址";
default:
return "-";
}
}
public List<Student> getstudents() {
return students;
}
public void setstudents(List<Student> students) {
this.students = students;
}
}
如何使用自定义TableModel
ScrollPanel scrollPanel = new JScrollPane();
StudentTableModel tableModel = new StudentTableModel(studentList);//创建StudentTableModel,传入内容数据集合
JTable jtable = new JTable(tableModel);//使用接受TableModel参数的构造方法创建JTable
jtable.getColumnModel().getColumn(0).setPreferredWidth(5);//设置第一列的列宽
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();//单元格渲染器
tcr.setHorizontalAlignment(JLabel.CENTER);//居中显示
jtable.setDefaultRenderer(Object.class, tcr);//设置渲染器
scrollPanel.setViewportView(emailAddress);//将table放入scrollPanel