【问题标题】:AbstractTableModel tutorial [closed]AbstractTableModel 教程 [关闭]
【发布时间】:2012-03-23 20:02:49
【问题描述】:

我正在做一个需要在 jtable 上显示一些数据的项目。我找到了很多关于 jtables 的教程,但很少有关于如何自定义 AbstractTableModel 的教程,大部分都是现成的代码。 即使在 Oracle 的页面中,我也找到了这个通用的 jtable 教程,但是关于 AbstractTableModel 以及如何制作自定义模型。Oracle Jtable Tutorial 我是编程新手,所以将为我的技能水平提供一个教程。 提前谢谢你。

【问题讨论】:

  • 你通过this tutorial了吗?
  • 是的。我做到了。我发现它大部分都很简单,但关于 AbstractTableModel 的信息不多。
  • 或者你自己真的试过了吗?声明您的类(例如 MyTableModel),扩展 AbstractTableModel,您将看到需要实现哪些方法。它们的名称和返回类型非常简单明了,应该不会太复杂。
  • 谢谢!我为自己的项目尝试了一个现成的课程,但我期待学习如何正确使用它,这就是为什么我正在寻找一个好的教程,如果它存在的话!谢谢。

标签: java abstracttablemodel


【解决方案1】:

AbstractTableModel 包含三个需要被覆盖的方法。它们是:

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

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

Object[][] data;

或数组的ArrayList:

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

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

还有一些方法可以被覆盖,但不是必须的。例如,如果您想要自定义列名,则必须另外覆盖 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);
}

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2014-03-05
  • 2012-04-24
  • 2010-09-06
  • 2011-05-18
  • 2012-06-02
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多