JTable AbstractTableModel没有触发动态数据列表

时间:2014-08-14 11:01:29

标签: java swing jtable

我设法潜伏并找到一个好的课程,提供用JTable(Object[][] data, Object[] columnNames)代替RowTableModel(List<T> modelData, List<String> columnNames),这很棒,因为它允许我直接从我的学生动态添加我的学生数据.ser文件。

在花上帝知道多久之后,我无法解决一个奇怪的问题。该表正在显示除了内部数据之外的所有内容。


这是目前的结果: enter image description here

显然那些空行是我拥有的学生数(在这种情况下为5),但是没有数据被打印出来。

我的想法是我需要为每一列分配一个特定的学生字段,例如。对于行名称,我指定了Student.getName()


如果您想查看RowTableModel

以下是我使用过的文档类方法/构造函数:

构造

/**
 *  Constructs a <code>RowTableModel</code> with initial data and
 *  customized column names.
 *
 *  Each item in the <code>modelData</code> List must also be a List Object
 *  containing items for each column of the row.
 *
 *  Each column's name will be taken from the <code>columnNames</code>
 *  List and the number of colums is determined by thenumber of items
 *  in the <code>columnNames</code> List.
 *
 *  Sub classes creating a model using this constructor must make sure
 *  to invoke the setRowClass() method.
 *
 * @param modelData      the data of the table
 * @param columnNames      <code>List</code> containing the names
 *                          of the new columns
 */
protected RowTableModel(List<T> modelData, List<String> columnNames)
{
    setDataAndColumnNames(modelData, columnNames);
}

setDataAndColumnNames:

/**
 *  Reset the data and column names of the model.
 *
 *  A fireTableStructureChanged event will be generated.
 *
 * @param modelData      the data of the table
 * @param columnNames      <code>List</code> containing the names
 *                          of the new columns
 */
protected void setDataAndColumnNames(List<T> modelData, List<String> columnNames)
{
    this.modelData = modelData;
    this.columnNames = columnNames;
    columnClasses = new Class[getColumnCount()];
    isColumnEditable = new Boolean[getColumnCount()];
    fireTableStructureChanged();
}

getValueAt(int row,int col) - 工作代码!:

@Override
    public Object getValueAt(int row, int col) {
        Student myStudent = getRow(row);
        switch(col){
            case 1: return students.get(row).getTeacherId();
            case 2: return students.get(row).getId();
            case 3: return students.get(row).getName();
            case 4: return students.get(row).getSurname();
            case 5: return students.get(row).getEmail();
            case 6: return students.get(row).getDateOfBirth();
            case 7: return students.get(row).getTel();
            case 8: return students.get(row).getCourse();
            case 9: return students.get(row).isOOP();
            case 10: return students.get(row).getYearOfMembership();
            case 11: return students.get(row).hasConsent();
            default: return null;
        }
    }

2 个答案:

答案 0 :(得分:3)

来自您提供的link

  

RowTableModel 是一个抽象类。它未实现 TableModel的 getValueAt() setValueAt()方法。这将允许您扩展模型以支持模型中任何类型的行对象。您只需要扩展此类,以便为特定的行对象类型实现这些方法。有关如何完成此操作的简单示例,请参阅下面的JButtonTableModel示例代码。

如果没有实现这些方法,JTable将无法查询表数据模型。因此,不会使用构造函数中传递的数据。

请参阅the Java Doc for TableModel

答案 1 :(得分:1)

  

似乎我并没有完全掌握整个事情

可能需要一段时间,但我不得不问为什么你的代码看起来不像示例中的代码?我在示例中的哪个位置引用了二维数组?

您要做的只是显示Student对象而不是JButton对象。所以你基本上只需要将JButton的所有引用更改为Student,然后填写Student的属性。

所以我再一次问,代码如何扩展RowTableModel?你不明白getValueAt()方法的哪个部分?

示例中的代码是:

@Override
public Object getValueAt(int row, int column)
{
    JButton button = getRow(row);

    switch (column)
    {
        case 0: return button.getText();
        case 1: return button.getToolTipText();
        case 2: return button.isEnabled();
        case 3: return button.isVisible();
        default: return null;
    }
}

您没有在模型中存储JButton对象,因此您更改了Student对象的代码。类似的东西:

@Override
public Object getValueAt(int row, int column)
{
    Student student = getRow(row);

    switch (column)
    {
        case 0: return student.getTeacherId();
        case 1: return student.getId();
        case 2: return ...;
        case 3: return ...;
        default: return null;
    }
}

我们不介意读者。我们不知道你有什么困惑。如果您没有提出具体问题,那么您希望我们如何提供帮助?这就是为什么你发布代码所以我们可以更好地了解你想要做什么或做了什么。