Java fireTableDataChanged() 不更新 JTable

标签 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)类 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 时,它会正常工作。

最佳答案

fireTableDataChanged doesn't seem to work for me:

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

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

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

 fireTableStrucutreChanged();

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

关于Java fireTableDataChanged() 不更新 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332670/

相关文章:

java - 将文本显示到另一个类的标签 - JFrame

java - 使用 BorderLayout 时如何防止 JPanel 中的内容拉伸(stretch)?

java - 如何对两个对象使用集合方法(removeAll() 和 retainAll())。 (对象是父子关系)

java - 为什么 Java 需要接口(interface)而 Smalltalk 不需要?

java - 将资源复制到 sdcard 会导致 android 中的文件损坏

java - 如何获取文本字段值并在下一个 JFrame 中打印 Neo4j Cypher 查询的结果?

java - 在 mysql 中检查用户名...如果存在则插入到其他表中否则基表

java - SOLR 将 JSON 响应转换为 javabin

java - 如何旋转JXImagePanel?

java - 将 JFrames 放在 JFrames 中