我有一个具有X个字段的对象。我的JTable中的每一行对应一个项目。行中的每一列代表该项的字段。我还需要保持对项目的引用(该项目也有唯一的ID字段),这样我就可以确定所选单元格中的项目。
首选方法是将实际对象放在表格中的每个单元格中,并使用各种渲染器显示项目或简单地将字段值放在每个单元格中,并使用具有项目ID的隐藏列我需要知道物品ID时可以参考吗?
感谢, 杰夫
答案 0 :(得分:3)
我会编写一个自定义表模型(而不是试图将您的设计变为默认的表模型实现)。然后,该模型保存您的实际对象,并在其方法实现(例如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();
}
}
}
答案 1 :(得分:1)
您可以使用Bean Table Model。如果没有,那么JButtonTableModel示例显示了如何实现getValueAt / setValueAt()方法并利用RowTableModel提供的功能,因此您无需从头开始创建TableModel。
答案 2 :(得分:0)
我首选的方法是建立一个表模型,从每个列的字段中返回一个值。为了能够获得对象的引用,我向模型添加了一个可以称为getObjectFromRow的方法,顾名思义,它返回对应于行索引的对象。这样,您可以在单元格中显示实际显示的数据,并且不需要隐藏列来获取对行对象的引用。当然这需要一个自定义的桌面模型,但我认为这是值得的麻烦 当然,使用渲染器来显示来自正确字段的数据也是可能的,但根据我的经验,这有几个问题,包括为不同数据类型编写所有渲染器的麻烦以及复制和放大的事实。表格中的粘贴无法正常使用。