Swing:单个AbstractTableModel用于多个对象??

时间:2011-11-25 08:53:59

标签: java swing jtable abstracttablemodel

我有不同的对象,用于在ArrayList<T>中存储来自数据库的数据。我必须在表格中显示每个记录。我正在使用AbstractTableModel作为第一个对象。 AbstractTableModel类有一个ArrayList<Relation>和一个String[]标题。

我的问题是:如何创建可用于所有对象的相同AbstractTableModel。我的意思是,如果使用Relation,我可以ArrayList<Relation>,如果使用Product,则可以ArrayList<Product> ..等。根据我的说法,为每个人写AbstrastTableModel不是一个好主意。主要问题来自setValueAtgetValueaddRow ....

    @Override
public void setValueAt(Object value, int row, int col) {
    Relation r = data.get(row);     // ArrayList<Relation> data
    switch (col) {
        case 0:
            r.setId(value.toString());
            break;
        case 1: r.setName(value.toString());
            break;
        case 2: r.setStartBalance((Double)value);
            break;
        case 3: r.setCurrentBalance((Double)value);
            break;
    }
}

任何好主意都可以将其作为一个适用于所有人的单一模型。并且还可以从这里为桌子发射事件。

我知道这有点复杂。但结构庞大,为每个对象创建新的AbstractTableModelJTable类也不是一个好主意。

你有什么建议?

2 个答案:

答案 0 :(得分:3)

您可以在多个数据类上创建一个抽象,以便它们公开setValue(int columnNumber,Object Value)和类似的getValue()方法之类的方法。然后,您可以在这个新的抽象上编写AbstractTableModel。之后创建所需的表模型只需要在模型的构造函数中更改数据类。

例如,您可以拥有一个界面:

interface DBRow
{
    public void setValue(int columnNumber, Object value);
    public Object getValue(int columnNumber);
}

Product和Relation类都应该实现这一点,然后你的模型可以在DBRow接口上工作。

您还可以考虑直接使用resultset填充表格: resultset-to-tablemodel

答案 1 :(得分:0)

在我看来,一个AbstractTableModel只应该用于一种对象类型。也许你应该重新考虑你的数据模型。

无论如何,解决此问题的肮脏方法可能是在ArrayList<Object>中使用AbstractTableModel,并使用getValue()检查instanceof - 方法的类型。然后,您可以根据对象类型决定返回该特定对象的参数。

示例:

@Override
public void setValueAt(Object value, int row, int col) {
    Object r = data.get(row);     // ArrayList<Object> data
    switch (col) {
        case 0:
            if (r instanceof Relation) {
               ((Relation)r).setId(value.toString());
            } else {
               // do something with Product
            }
            break;
    }
}

这对你有用吗?