动态重置 JTable 的内容;设置列 headers 一次

Reset content of JTable dynamically; set column headers once

在我的 java 代码中,我使用了 JTable。不编辑,显示一些内容

我必须:

现在,我有这个:

public class MyClass {
 final JTable table;

 public MyClass(List<List> changingContent, String[] columnHeaders) {
  table = new JTable(new DefaultTableModel());
  initTable(columnHeaders); //only done once
  redrawTable(changingContent); //happens always when content changed
 }

 public void initTable(String[] columnHeaders) {
  //???? 1)
 }

 public void redrawTable(List<List> content) {
  int index = 0;
    for(Object o:content) {
        String[] rowData = presentAsStringArray(o);

        for(int i=0; i<rowData.length; i++) {
            int row = index;
            int column = i;

            //this produces an error since the rows don't exist yet
            table.getModel().setValueAt(rowData[i], row, column);
        }
        index++;
    }
 }
}

我试过:

  1. 使用 DefaultTableModel-构造器`DefaultTableModel (String[] columnHeaders, int rows)。它变坏了,因为此时我不知道行数(我不知道,因为这可能会改变。)
  2. 一个想法:setTableModel(new TableModel(data, columnHeaders) 在任何重绘。但是我想知道这是否不是解决这个问题的最低效的方法。

我遇到的错误:


TL;DR

  1. 我在创建 MyClass 时得到 JTable 的列 headers。
  2. 我知道表数据的模型,但它在动态变化。
  3. 方法 redrawTable 将在任何更改后变为 运行。
  4. 我找到了一种应该能够重绘单元格的方法。不幸的是,行数取决于。
  5. 最终猜测:我很确定在任何重绘时重置 TableModel 都可以。但对我来说似乎效率不高。 那么为什么(不)这样做?

不确定我是否理解正确。当你需要改变行数时,你只需要使用方法DefaultTableModel.setRowCount(int)。像这样:

public class MyClass {
     final JTable table;
     final DefaultTableModel model;

     public MyClass(List<List> changingContent, String[] columnHeaders) {
          model = new DefaultTableModel(columnHeaders, 0); // init model with 0 rows
          table = new JTable(model);
          redrawTable(changingContent); //happens always when content changed
     }


     public void redrawTable(List<List> content) {
        model.setRowCount(content.size()); // set the correct row count here
        int index = 0;
        for(Object o:content) {
            String[] rowData = presentAsStringArray(o);

            for(int i=0; i<rowData.length; i++) {
                int row = index;
                int column = i;

                //this produces an error since the rows don't exist yet
                model.setValueAt(rowData[i], row, column);
            }
            index++;
        }
     }
}

use the DefaultTableModel-constructor `DefaultTableModel (String[] columnHeaders, int rows). It went bad because I don't know the number of rows at this point (and I can't know, because this can change.)

这是正确的做法。您只需将行设置为 0。这只会在您第一次创建 table/model 时完成。

set content dynamically

然后您可以使用 setRowCount(0);

清除所有数据

然后使用 DefaultTableModel 的 addRow(...) 方法动态添加行。

所以你的基本逻辑是:

DefaultTableModel model = (DefaultTableModel)table.getModel();
model.setRowCount(0);

for(Object o:content) 
{
    String[] rowData = presentAsStringArray(o);
    model.addRow( rowData );
}