给定一个对象填充JTable

时间:2013-10-31 14:55:10

标签: java swing jtable tablemodel abstracttablemodel

假设我有一个List Items(我自己创建的有5个字段的类)。我想以某种方式将这些项目注入JTableJTable我想要某种方法,例如public String determineColumnText(Object o, int col),我可以将收到的Object转换为Item,然后根据col从Item中输出一个特定的值并将其返回以便显示它。

我尝试过搜索并看到许多答案说创建AbstractTableModel但是我看到的所有教程都没有提供我想要的任何内容。我最近看到的是public Object getValueAt(int rowIndex, int columnIndex),但这意味着我必须存储我要在AbstractTableModel内显示的所有对象。但是如果我想这样做,Object不会存储在AbstractTableModel内,但同时可以发送到AbstractTableModel

关于如何做到这一点的任何建议?

3 个答案:

答案 0 :(得分:3)

  

但是,如果我想这样做,以便Object不存储在AbstractTableModel

Object应始终存储在TableModel中。您可以在外部创建Object,但是您需要将Object添加到TableModel。一旦Object成为模型的一部分,您应该只通过TableModel方法对其进行操作。

请参阅Row Table Model以获取一个TableModel,它允许您在模型中存储对象,但允许您根据需要将数据检索为完整的对象。

您需要扩展该类以实现自己的getValueAt()setValueAt()方法。这些方法将访问对象的各个属性。 JButtonTableModel.java示例显示了如何执行此操作。

答案 1 :(得分:1)

选项1:

  • 遍历您的项目列表。
  • 构建所有单元格的数据数组
  • 将该数组传递给DefaultTableModel的构造函数,您将在JTable中使用它

选项2:

  • 扩展DefaultTableModel并覆盖getValueAt(),就像您描述的那样
  • 在表格模型中存储对列表的引用

如果数据没有变化,选项1可以很简单。选项2是最灵活的,但你似乎有一个没有解释的对象。

答案 2 :(得分:0)

我将粘贴你如何使用AbstractTableModel来填充表格。

public class InventoryModel extends AbstractTableModel {

private static final String[] columnNames = { "Owner", "Location", "Sample Name", "Form Factor" };
private List<Samples> samplesList;

public InventoryModel(){
    samplesList = SampleQueries.getAvailableSamples();

}

@Override
public int getColumnCount() {
    // TODO Auto-generated method stub
    return columnNames.length;
}

@Override
public int getRowCount() {
    return samplesList.size();
}

@Override
public String getColumnName(int column) {
    return columnNames[column];
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    switch (columnIndex) {
    case 0:
        return samplesList.get(rowIndex).getCurrentOwner();
    case 1:
        return samplesList.get(rowIndex).getSampleLocation();
    case 2:
        return samplesList.get(rowIndex).getSampleName();
    case 3:
        return samplesList.get(rowIndex).getFormFactor();
    }
    return null;
}   

这就是我从专家组中调用它的方式。

    table = new JTable();
    model = new InventoryModel();
    model.fireTableDataChanged();
    panel.setLayout(new BorderLayout(0, 0));
    table.setModel(model);

    JScrollPane scroll = new JScrollPane(table);
    panel.add(scroll);

希望它对您有用