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

Java Swing:用于多个对象的单个AbstractTableModel??,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我有不同的对象,用于将DB中的数据存储在ArrayList中。我要在一张表中显示每个人的记录。我使用AbstractTableModel作为我处理的第一个对象。AbstractTableModel类有一个ArrayList和一个String[]标题 我的问题是:如何创建可用于所有对象的相同AbstractTableModel。我的意思是,如果使用关系,我可以拥有ArrayList,如果使用产品,我可以拥有ArrayList,等等。在我看来,为每个人编写不同的AbstrasAttableModel

我有不同的对象,用于将DB中的数据存储在
ArrayList
中。我要在一张表中显示每个人的记录。我使用
AbstractTableModel
作为我处理的第一个对象。
AbstractTableModel
类有一个
ArrayList
和一个
String[]
标题

我的问题是:如何创建可用于所有对象的相同
AbstractTableModel
。我的意思是,如果使用关系,我可以拥有
ArrayList
,如果使用产品,我可以拥有
ArrayList
,等等。在我看来,为每个人编写不同的
AbstrasAttableModel
不是一个好主意。主要问题是
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;
    }
}
@覆盖
public void setValueAt(对象值、整行、整列){
关系r=data.get(行);//ArrayList数据
开关(col){
案例0:
r、 setId(value.toString());
打破
案例1:r.setName(value.toString());
打破
案例2:r.setStartBalance((双)值);
打破
案例3:r.setCurrentBalance((双)值);
打破
}
}
将其作为一个适用于所有人的单一模型进行研究有什么好主意吗。也可以从这里为表触发事件

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


您有什么建议?

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

例如,您可以有一个接口:

interface DBRow
{
    public void setValue(int columnNumber, Object value);
    public Object getValue(int columnNumber);
}
产品和关系类都应该实现这一点,然后您的模型就可以在DBRow接口上工作

还可以考虑直接使用结果集填充表:


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

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

例如:

@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;
    }
}
@覆盖
public void setValueAt(对象值、整行、整列){
对象r=data.get(行);//ArrayList数据
开关(col){
案例0:
if(关系的r实例){
((关系)r).setId(value.toString());
}否则{
//对产品做些什么
}
打破
}
}

这对你有用吗?

我不清楚的一个问题是,你是不是想把不同的对象放在一起。类放在一列中,或者每列都有自己的对象。类,两种方式都是很可能的,这看起来[]像是模型的非法实现:它必须在更改时通知其侦听器,即FirexxUpdate。[]“Looks”,因为可能关系是一个bean,即在属性更改时触发,模型正在侦听这些更改并在接收更改时触发-这是合适的场景:-)@kleopatra,我就是这样做的,它工作得很好。向模型添加/反映更改,然后在收到更改时相应地触发。请详细说明您的观点。我不是100%清楚。也许只是课堂上的定义会让这个想法更好。谢谢AKJ,这个帮助很好。然而,在添加和编辑时,我打开了一个包含文本字段的新窗口。为此,我必须将对象传递给正确的面板对象。在从Panel对象添加/编辑后,我再次展示了这个表。如果一切都很好,那么最好的是。我已经想到了这个想法,但正在考虑一个更好的实现方案。