Java Swing:用于多个对象的单个AbstractTableModel??
我有不同的对象,用于将DB中的数据存储在Java Swing:用于多个对象的单个AbstractTableModel??,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我有不同的对象,用于将DB中的数据存储在ArrayList中。我要在一张表中显示每个人的记录。我使用AbstractTableModel作为我处理的第一个对象。AbstractTableModel类有一个ArrayList和一个String[]标题 我的问题是:如何创建可用于所有对象的相同AbstractTableModel。我的意思是,如果使用关系,我可以拥有ArrayList,如果使用产品,我可以拥有ArrayList,等等。在我看来,为每个人编写不同的AbstrasAttableModel
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对象添加/编辑后,我再次展示了这个表。如果一切都很好,那么最好的是。我已经想到了这个想法,但正在考虑一个更好的实现方案。