AbstractTableModel教程

时间:2012-03-23 20:02:49

标签: java abstracttablemodel

我正在开发一个需要在jtable上显示一些数据的项目。我发现了许多关于jtables的教程,但很少有关于如何自定义AbstractTableModel的教程,大多数部分都是现成的代码。 即使在Oracle的页面中,我发现了这个通用的jtable教程,但很少有信息 AbstractTableModel以及如何制作自定义模型。Oracle Jtable Tutorial 我是编程的新手,所以将为我的skils级别提供apriciate教程。 先谢谢你。

1 个答案:

答案 0 :(得分:18)

AbstractTableModel包含三个需要覆盖的方法。这些是:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

JTable使用这些方法找出有多少字段(行和列),并获取每个字段的值(作为Object类型)。覆盖这些方法时,您需要使用哪种数据类型。例如,您可以使用二维对象数组:

Object[][] data;

或ArrayList或Hashtable:

List<Object[]> data = new ArrayList<Object[]>();

修复大小的数组可能更容易使用,但动态添加值更加困难。当然,您也可以使用地图或其他数据结构。您只需要调整上述三种方法的实现,即可从数据结构中返回正确的信息,例如模型当前包含的行数等等。

还有一些可以被覆盖的方法,但不必如此,例如,如果您想要自定义列名,则必须另外覆盖public String getColumnName(int col)方法。例如:

private static final String[] COLUMN_NAMES = {"User", "Password", "Age"};
public String getColumnName(int col) {
    return COLUMN_NAMES[col];
}

查看AbstractTableModel的Javadoc,了解可以覆盖的其他方法。

如果您希望能够更改TableModel中的数据,则需要覆盖setValueAt方法(如果我没有记错的话):

void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    //depending on your data structure add the aValue object to the specified
    //rowIndex and columnIndex position in your data object
    //notify the JTable object:
    fireTableCellUpdated(row, col);
}

重要说明:无论何时添加或删除行,TableModel实现中的相应函数都必须调用相应的fireTableRowsInserted(或删除)函数。否则你会看到JTable发生奇怪的视觉效果:

public void addRow(Object[] dates) {
    data.add(dates);
    int row = data.indexOf(dates);
    for(int column = 0; column < dates.length; column++) {
        fireTableCellUpdated(row, column);
    }
    fireTableRowsInserted(row, row);
}