Java fireTableDataChanged() 不更新 JTable

Moh*_* Li 0 java swing

fireTableDataChanged 似乎对我不起作用:

类主要:

    tblBookOfMonth = new JTable(tableModel);

    tableModel.setData();
    tableModel.fireTableDataChanged();
    tblBookOfMonth.repaint();

    frame.add(tblBookOfMonth, BorderLayout.CENTER);
    frame.add(pnlNorth, BorderLayout.NORTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

MySQLTableModel 类:

公共类 MySQLTableModel 扩展 AbstractTableModel{

private Object[][] data;
boolean bool = false;


public MySQLTableModel(Object[][] data) {
    this.data = data;
}

public MySQLTableModel() {
    this.data = new Object[0][0];
}

public void setData() {
    bool = true;
}

@Override
public int getColumnCount() {
    if(bool) {
        return 4;
    }
    return 0;
}

@Override
public int getRowCount() {
    if(bool) {
        return 4;
    }
        return 0;
}

@Override
public Object getValueAt(int arg0, int arg1) {
    return "test";
}
Run Code Online (Sandbox Code Playgroud)

我删除了一半的代码并用测试代码替换它以尽量减少可能的错误源,但我仍然无法弄清楚出了什么问题。

表格应该显示一个 4x4 网格,上面写着“测试”。当我删除 if 子句并始终返回 4 时,它会正常工作。

cam*_*ckr 5

fireTableDataChanged 似乎对我不起作用:

这意味着什么?我们不是读心术的人。会发生什么以及您期望发生什么?

正如已经提到的,fireXXX(() 方法应该从 TableModel 本身调用,而不是应用程序代码。也就是说,TableModel 负责调用这些方法来让表知道已进行更改。因此,任何代码都应该从在 setData() 方法中。

快速浏览一下代码,您似乎正在尝试更改显示的列数。如果是这样,那么我怀疑您应该将以下代码添加到 setData() 方法中:

 fireTableStrucutreChanged();
Run Code Online (Sandbox Code Playgroud)

这将告诉表为 TableModel 中的每一列创建一个TableColum,以便表​​可以显示数据。