[英]Java JTable object with multiple fields
我有一个具有X个字段的对象。 我的JTable中的每一行对应一个项目。 行中的每一列代表该项的字段。 我还需要保持对项目的引用(该项目也有唯一的ID字段),这样我就可以确定所选单元格中的项目。
首选方法是将实际对象放在表格中的每个单元格中,并使用各种渲染器显示项目或简单地将字段值放在每个单元格中,并使用具有项目ID的隐藏列,我可以我需要知道物品ID时的参考?
谢谢,杰夫
我会编写一个自定义表模型(而不是试图将您的设计变为默认的表模型实现)。 然后,该模型保存您的实际对象,并在其方法实现(例如getValueAt
)中,将每个字段视为一列。
简单的例子(未经过测试,但应该很好地说明这个想法):
import java.util.List;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
/**
* Simple table model for displaying properties common to all objects.
* Note that all methods must run inside the event dispatch thread.
*/
public class ObjectPropertyTableModel extends AbstractTableModel {
private final List<Object> objects = new ArrayList<Object>();
public void addObject(Object obj) {
addObject(obj, objects.size());
}
public void addObject(Object obj, int index) {
objects.add(index, obj);
fireTableRowsInserted(index, index);
}
public void removeObject(Object obj) {
int index = objects.indexOf(obj);
objects.remove(index);
fireTableRowsDeleted(index, index);
}
public Object getObject(int rowIndex) {
return objects.get(rowIndex);
}
@Override
public int getRowCount() {
return objects.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0: return "toString";
case 1: return "hashCode";
case 2: return "class";
default: throw new IndexOutOfBoundsException();
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0: return String.class;
case 1: return Integer.class;
case 2: return Class.class;
default: throw new IndexOutOfBoundsException();
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object obj = objects.get(rowIndex);
switch (columnIndex) {
case 0: return obj.toString();
case 1: return obj.hashCode();
case 2: return obj.getClass();
default: throw new IndexOutOfBoundsException();
}
}
}
您可以使用Bean表模型 。 如果没有,那么JButtonTableModel示例显示了如何实现getValueAt / setValueAt()方法并利用RowTableModel提供的功能,因此您无需从头开始创建TableModel。
我首选的方法是建立一个表模型,从每个列的字段中返回一个值。 为了能够获得对象的引用,我向模型添加了一个可以称为getObjectFromRow的方法,顾名思义,它返回对应于行索引的对象。 这样,您可以在单元格中显示实际显示的数据,并且不需要隐藏列来获取对行对象的引用。 当然这需要一个自定义表模型,但我认为这是值得的麻烦。
当然,使用渲染器来显示来自正确字段的数据也是可能的,但根据我的经验,这有几个问题,包括为不同数据类型编写所有渲染器的麻烦,以及从表中复制和粘贴不起作用的事实开箱即用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.