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



在我的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-constructor 'DefaultTableModel (String[] columnHeaders, int rows)。它变坏了,因为此时我不知道行数(我无法知道,因为这可能会改变。
  2. 一个想法:在任何重绘时setTableModel(new TableModel(data, columnHeaders)。但我想知道这是否不是解决这个问题的最低效的方法。

我得到的错误:

  • ArrayIndexOutOfBoundsException来自以下行,我试图使用它来设置列标题:table.getColumnModel().getColumn(index).setValue(columnHeaders[index]);我的猜测:TableColumn已经存在才能使getColumn(index)工作。
  • ArrayIndexOutOfBounds使用以下方式实例化JTable时重置内容(查找当前代码)的异常:new JTable(new DefaultTableModel(columnHeaders, 0);(0表示行数。我认为这可以工作,因为我要重写它们。我的猜测:行必须已存在。

TL;博士

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

使用 DefaultTableModel-constructor 'DefaultTableModel (String[] columnHeaders, int rows)。它变坏了,因为此时我不知道行数(我无法知道,因为这可能会改变。

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

动态设置内容

然后你可以通过使用 setRowCount(0) 清除所有数据;

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

所以你的基本逻辑是:

DefaultTableModel model = (DefaultTableModel)table.getModel();
model.setRowCount(0);
for(Object o:content) 
{
String[] rowData = presentAsStringArray(o);
model.addRow( rowData );
}

不确定我是否纠正了你。当您需要更改行数时,您只需要使用方法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++;
}
}
}

最新更新