当前位置: 首页 > 知识库问答 >
问题:

JTable AbstractTableModel不触发动态数据列表

长孙瑞
2023-03-14

我设法潜伏在周围并找到一个好的类,它提供用RowTableModel(List)替换JTable(Object[][]data, Object[]列名称)

天知道花了多长时间,我还没能解决一个奇怪的问题。该表正确显示了除了内部数据之外的所有内容。

显然,这些空行是我拥有的学生数(在本例中为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行,int列)-工作代码!:

@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个答案

常波鸿
2023-03-14

看来我没有完全理解整件事

这可能需要一段时间,但我必须问,为什么您的代码看起来与示例中的代码完全不同?在示例中,我在哪里引用二维数组?

您所要做的就是显示一个 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对象,因此您更改了学生对象的代码。类似于:

@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;
    }
}

我们不会读心术。我们不知道是什么迷惑了你。如果你不问一个具体的问题,你怎么能指望我们提供帮助呢?这就是为什么你张贴你的代码,以便我们可以更好地了解你正在试图做什么或已经做了什么。

桓兴腾
2023-03-14

从您提供的链接:

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

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

请参阅TableModel的Java文档。

 类似资料:
  • 问题内容: 如何设置Jenkins作业以触发在变量/参数中动态定义的作业? 我的问题的伪代码: 生成操作“触发/调用在其他项目上生成”以及生成后操作“参数化触发器插件”和“生成其他项目”不允许在参数中定义作业名称。 我似乎没有将GroovyAxis插件与Build多重配置项目一起使用。常规代码似乎不在作业构建环境中运行,而是在作业配置保存期间运行。 我了解您可以通过脚本通过其build-start

  • 问题内容: 我有一个针对ui-select2下拉菜单的手表设置(来自ui-bootstrap)。手表会在加载时触发,但不会在数据更改时触发,我不知道为什么。 不应用模型更改或不使用第三个参数进行相等性比较(至少来自我的代码)不是一个常见的问题。 我需要怎么做才能使其点火? 这是一个说明问题的小问题。 问题答案: 我修好了一些东西。 http://plnkr.co/edit/5Zaln7QT2gET

  • 我在动态数据库表上启用了流。修改项目时,将触发 lambda 函数。我认为我在 lambda 触发器端、权限端和 dynamodb 端都正确设置了所有内容。我还使用测试数据运行了我的lambda函数,它成功了。但是,当表中的项被修改时,触发器没有启动我的 lambda 函数。相反,我得到了以下错误: 批量:100最后处理结果:问题:函数调用失败 你知道调试这个的最佳方法是什么吗?我查看了Cloud

  • 我有这个脚本: HTML中的用法: 由于某些原因,它的工作,如果页面重新加载一半,但不,它没有开火,在它工作之前,所以我不知道发生了什么。我在wordpress网站上使用这个。

  • 问题内容: 我正在使用JavaFX使用一个简单的CSV Viewer测试自己,并且无法填充表格数据。我确实动态创建了列,但是数据值是不行的。我在网上搜索后发现了几种方法,但是所有方法都包括带有自定义类(包括获取/设置)的ObservableList,该类在CSV查看器中必须是动态的(CSV可以有任意数量的列,这意味着可以有任意数量的数据值)。 例: 问题答案: 使用DataFX,这将使您的工作更轻

  • 如 动态 Inventory 所介绍,ansible可以从一个动态的数据源获取到inventory信息,包含云端数据源 怎么写一个自己的数据源? 很简单!我们仅仅需要创建一个在适当参数下,能够返回正确JSON格式数据的脚本或者程序,你可以使用任何语言来实现. 脚本规范 当我们在外部使用``–list``参数调用这个脚本时,这个脚本必须返回一个JSON散列/字典,它包含所管理的所有组.每个组的val