Java fireTableDataChanged()没有更新JTable

时间:2014-12-06 14:25:42

标签: 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);

类MySQLTableModel:

public class 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";
}

我删除了一半的代码并将其替换为测试代码,以尽量减少可能的错误来源,但我仍然无法弄清楚错误是什么。

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

1 个答案:

答案 0 :(得分:4)

  

fireTableDataChanged似乎不适合我:

这是什么意思?我们不介意读者。会发生什么,你期望发生什么?

如前所述,应该从TableModel本身调用fireXXX(()方法,而不是应用程序代码。这就是TableModel负责调用这些方法让表知道已经进行了更改。所以任何代码都应该从setData()方法中调用。

从快速查看代码看起来您​​正在尝试更改显示的列数。如果是这样,那么我怀疑你应该将以下代码添加到setData()方法:

 fireTableStrucutreChanged();

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