动态重置 JTable 的内容;设置列 headers 一次
Reset content of JTable dynamically; set column headers once
在我的 java 代码中,我使用了 JTable
。不编辑,显示一些内容
我必须:
- 设置列headers一次
- 动态设置内容
现在,我有这个:
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++;
}
}
}
我试过:
- 使用
DefaultTableModel
-构造器`DefaultTableModel (String[] columnHeaders, int rows)。它变坏了,因为此时我不知道行数(我不知道,因为这可能会改变。)
- 一个想法:
setTableModel(new TableModel(data, columnHeaders)
在任何重绘。但是我想知道这是否不是解决这个问题的最低效的方法。
我遇到的错误:
- ArrayIndexOutOfBoundsException 从我试图用来设置列 headers 的以下行:
table.getColumnModel().getColumn(index).setValue(columnHeaders[index]);
我的猜测: TableColumn
已经存在才能使 getColumn(index)
工作。
- ArrayIndexOutOfBoundsException 在使用以下方法实例化
JTable
时从重置内容(查找当前代码):new JTable(new DefaultTableModel(columnHeaders, 0);
(0
表示行数。我认为这可行,因为我要重写它们。)我的猜测: 行已经存在。
TL;DR
- 我在创建 MyClass 时得到
JTable
的列 headers。
- 我知道表数据的模型,但它在动态变化。
- 方法
redrawTable
将在任何更改后变为 运行。
- 我找到了一种应该能够重绘单元格的方法。不幸的是,行数取决于。
- 最终猜测:我很确定在任何重绘时重置 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 );
}
在我的 java 代码中,我使用了 JTable
。不编辑,显示一些内容
我必须:
- 设置列headers一次
- 动态设置内容
现在,我有这个:
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++;
}
}
}
我试过:
- 使用
DefaultTableModel
-构造器`DefaultTableModel (String[] columnHeaders, int rows)。它变坏了,因为此时我不知道行数(我不知道,因为这可能会改变。) - 一个想法:
setTableModel(new TableModel(data, columnHeaders)
在任何重绘。但是我想知道这是否不是解决这个问题的最低效的方法。
我遇到的错误:
- ArrayIndexOutOfBoundsException 从我试图用来设置列 headers 的以下行:
table.getColumnModel().getColumn(index).setValue(columnHeaders[index]);
我的猜测:TableColumn
已经存在才能使getColumn(index)
工作。 - ArrayIndexOutOfBoundsException 在使用以下方法实例化
JTable
时从重置内容(查找当前代码):new JTable(new DefaultTableModel(columnHeaders, 0);
(0
表示行数。我认为这可行,因为我要重写它们。)我的猜测: 行已经存在。
TL;DR
- 我在创建 MyClass 时得到
JTable
的列 headers。 - 我知道表数据的模型,但它在动态变化。
- 方法
redrawTable
将在任何更改后变为 运行。 - 我找到了一种应该能够重绘单元格的方法。不幸的是,行数取决于。
- 最终猜测:我很确定在任何重绘时重置 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 );
}