刷新 java Jtable 以显示更新后的数据

Refreshing the java Jtable to show updated data

每当我查询 mysql 数据库时,我都试图刷新 UI 中显示的 Jtable。这个想法是显示 UI JTable 中更新的任何新数据。

下面是UIclass

public class DBView {

private JFrame frame = new JFrame();    

private JScrollPane tableScrollPane = new JScrollPane();
private DefaultTableModel dbTable = new DefaultTableModel(); 


public void setDbTable(DefaultTableModel dbTable) {
    this.dbTable = dbTable;
    //this.dbTable.repaint();
    paintDBTable();

}

public DefaultTableModel getDbTable() {
    return dbTable;
}
public DBView() {
    initializeFrame();
    paintDBTable();

}

private void paintDBTable() {


    tableScrollPane.setBounds(20, 350, 400, 80);
    frame.getContentPane().add(tableScrollPane);
    JTable DBTable = new JTable(dbTable);
    tableScrollPane.add(DBTable);
    DBTable.setFillsViewportHeight(true);
    tableScrollPane.setViewportView(DBTable);

 }

/**
 * Initialize the contents of the frame.
 */
private void initializeFrame() {
    frame.setVisible(true);
    frame.setBounds(100, 100, 451, 525);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);
    frame.setTitle("MySQL Database");
}

来自另一个模型 class 我正在调用 setDbTable() 方法。我将一个新的 Jtable 对象输入到 setDbTable() 方法,并将从数据库中读取的数据输入到新的 Jtable 对象中。

问题出在 setDbTable() 方法中,我再次使用 paintDBTable() 方法。

我尝试使用 dbTable.fireTableDataChanged() 方法刷新视图,但没有用。

现在的方式,它正在运行。但是使用 setDbTable() 方法来刷新似乎是一种非常低效的方法。

问题是你是否看到我可以使用为刷新 Jtables 定义的另一种方法?

P.S。我对 java 和一般编程还很陌生。如果代码混乱,问题不清楚,请见谅。如果有帮助,我可以提供所有代码。我删除了原始代码中的大部分方法和其他 class 以使问题更清楚。

  1. tableScrollPane.add(DBTable);

  2. DefaultTableModel dbTable = new DefaultTableModel();

    • DefaultTableModel is model that hold value for presentations layer for the JTable
    • 将这个局部变量(即意义所在)重命名为 dbTableModel 而不是 dbTable

    • 您必须创建一个 JTables 视图,f.e。两个基本选项

      a) JTable myTable = new JTable(dbTableModel)

      b) myTable.setModel(dbTableModel)

  3. dbTable.fireTableDataChanged() 在 DefaultTableModel 中正确实现,不是调用此方法的原因,也不在模型定义之外(class,void,returns 的接口XxxTableModel)

  4. 链接的 Oracle 教程中的更多信息,...也适用于 SSCCE/MCVE 形式的工作代码示例

  5. 通过

    刷​​新 JTable 的数据
    • 删除 dbTableModel.setRowsCount(0); 中的所有行,然后将新行添加到 dbTableModel.addXxx

    • re_creating dbTableModel,注意必须加回 JTable 例如myTable.setModel(dbTableModel)

刷新JTable数据和刷新之后的UI就没有那么混乱了,因为:

Swing 组件以非常棒的方式实现了 MVC 和 Observer。这意味着无论何时更改 TableModel 中的数据,UI 都会收到通知并根据需要重新绘制。

因此,您应该更改代码,使您在 class 中保留 JTable 变量而不是 TableModel 变量。之后在setDbTable调用JTable的setModel方法,意思是:

public class DBView {

    private JTable jtable = new JTable(); 

    public void setDbTable(DefaultTableModel dbTable) {
        this.jtable.setModel(dbTable);
        //this.dbTable.repaint(); 
        //paintDBTable();
    }
    .
    .
    .
}

希望这会有所帮助, 祝你好运。