gpt4 book ai didi

java - JTable刷新不显示

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:07 28 4
gpt4 key购买 nike

我拼命试图说服我的 JTable 在我更改它的数据时进行刷新。数据存储在我正在使用的全局单例 TreeSet 中。每当 TreeSet 的数据发生更改时,都会触发一个事件来刷新 TableModel。出于测试目的,我将其替换为一个简单的 Timer 触发事件。

每次触发事件时,TreeSet 中的一个元素都会被移除以模拟数据的变化。事件触发,TableClass 接收它并按预期处理它,但在刷新时什么也没有发生。我尝试在每次事件发生时创建一个新的 TableModel 并将其设置为全局表。对单例 TreeSet 进行了更改,但 JTable 没有任何变化。

public class TreeTableObj implements ActionListener{
public JTable table ;

public TreeTableObj(){
MyTableModel myModel = new MyTableModel(getValuesOfTreeSet(), getTreeSetRows());

table = new JTable( myModel){ //some rendering };

table.setAutoCreateRowSorter(true);
}

class MyTableModel extends AbstractTableModel {
private String[] columnNames;
private Object[][] data ;


public MyTableModel(Object[][] data, String[] columnNames){
this.data = data;
this.columnNames = columnNames;
System.out.println("Model created");
}

public int getColumnCount() {
return columnNames.length;
}

public int getRowCount() {
return data.length;
}

public String getColumnName(int col) {
return columnNames[col];
}

public Object getValueAt(int row, int col) {
return data[row][col];
}

public void setData(Object[][] data){
this.data = data;
fireTableDataChanged();
}


public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}


public boolean isCellEditable(int row, int col) {
if (col < 2) {
return false;
} else {
return true;
}
}


public void setValueAt(Object value, int row, int col) {
if (true) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}

data[row][col] = value;
fireTableCellUpdated(row, col);

if (true) {
System.out.println("New value of data:");
printDebugData();
}
}

private void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();

for (int i=0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
System.out.print(" " + data[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
}
}

public void refreshTableModel(){
FlightsTreeSet.getInstance().remove(FlightsTreeSet.getInstance().first());
table.setModel(new MyTableModel(getValuesOfTreeSet(), getTreeSetRows()));
}

public void actionPerformed(ActionEvent arg0) {
refreshTableModel();
}
}

如有任何帮助,我们将不胜感激!

[编辑1]

我越来越接近核心问题:我发现 JFrame 中显示的表格包含另一个引用作为我更改的引用。我使所有更改可见,并且它们适用于模型。

最佳答案

您的代码中是否缺少某些内容?您的表格模型不应编译,因为它缺少 JTable 用于访问数据的所有方法(getColumnCount()getValueAt() 等) .)

此外,您不必在每次更改时都创建一个新模型 - 只需使用模型 fireTableStructureChanged()

关于java - JTable刷新不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10516213/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com