繁体   English   中英

具有多个字段的Java JTable对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM