首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AbstractTableModel教程

AbstractTableModel教程
EN

Stack Overflow用户
提问于 2012-03-24 04:02:49
回答 1查看 19K关注 0票数 3

我正在做一个需要在jtable上显示一些数据的项目。我找到了很多关于jtable的教程,但很少有关于如何定制AbstractTableModel的教程,大部分都是现成的代码。我甚至在Oracle的页面上找到了这个通用的jtable教程,但关于AbstractTableModel和如何制作定制模型的信息很少。Oracle Jtable Tutorial我是编程新手,所以我将根据我的技能水平提供一个教程。感谢您的支持。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-27 05:03:29

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

代码语言:javascript
复制
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

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

代码语言:javascript
复制
Object[][] data;

或数组的ArrayList:

代码语言:javascript
复制
List<Object[]> data = new ArrayList<Object[]>();

固定大小的数组可能更容易使用,但它更难做动态加值。当然,您也可以使用Map或其他数据结构。您只需调整上述三个方法的实现,以从数据结构中返回适当的信息,例如模型当前包含的行数等。

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

例如:

代码语言:javascript
复制
private static final String[] COLUMN_NAMES = {"User", "Password", "Age"};
public String getColumnName(int col) {
    return COLUMN_NAMES[col];
}

查看AbstractTableModel的Javadoc,以获得可覆盖的其他方法的概述。

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

代码语言:javascript
复制
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 (或deleted)函数。否则你会看到奇怪的视觉效果发生在你的JTable上:

代码语言:javascript
复制
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);
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9845800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档