我有不同的对象,用于在ArrayList<T>
中存储来自数据库的数据。我必须在表格中显示每个记录。我正在使用AbstractTableModel
作为第一个对象。 AbstractTableModel
类有一个ArrayList<Relation>
和一个String[]
标题。
我的问题是:如何创建可用于所有对象的相同AbstractTableModel
。我的意思是,如果使用Relation,我可以ArrayList<Relation>
,如果使用Product,则可以ArrayList<Product>
..等。根据我的说法,为每个人写AbstrastTableModel
不是一个好主意。主要问题来自setValueAt
,getValue
,addRow
....
@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;
}
}
任何好主意都可以将其作为一个适用于所有人的单一模型。并且还可以从这里为桌子发射事件。
我知道这有点复杂。但结构庞大,为每个对象创建新的AbstractTableModel
和JTable
类也不是一个好主意。
你有什么建议?
答案 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;
}
}
这对你有用吗?