【问题标题】:Refreshing the java Jtable to show updated data刷新 java Jtable 以显示更新的数据
【发布时间】:2015-06-24 09:53:00
【问题描述】:

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

UI 类如下。

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");
}

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

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

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

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

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

附:我对 java 和编程很陌生。抱歉,如果代码混乱且问题不清楚。如果有帮助,我可以提供所有代码。为了让问题更清晰,我把原代码中的大部分方法和其他类都去掉了。

【问题讨论】:

    标签: java swing user-interface jtable


    【解决方案1】:
    1. tableScrollPane.add(DBTable);

    2. DefaultTableModel dbTable = new DefaultTableModel();

      • DefaultTableModel is model 持有 JTable 表示层的值
      • 将此局部变量(即有意义)重命名为 dbTableModel 而不是 dbTable

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

        a)JTable myTable = new JTable(dbTableModel)

        b)myTable.setModel(dbTableModel)

    3. dbTable.fireTableDataChanged() 在 DefaultTableModel 中正确实现,不是调用此方法的理由,也不是在模型定义之外(类、void、返回 XxxTableModel 的接口)

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

    5. 通过

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

      • re_creating dbTableModel,然后必须将注释添加回JTable,例如myTable.setModel(dbTableModel)

    【讨论】:

      【解决方案2】:

      刷新JTable数据然后刷新UI并没有那么混乱,因为:

      Swing 组件以一种非常奇妙的方式实现了 MVC 和 Observer。这意味着每当您更改 TableModel 中的数据时,都会通知 UI 并根据需要重新绘制。

      所以你应该改变你的代码,在你的类中保留 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();
          }
          .
          .
          .
      }
      

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

      【讨论】:

      • 这是完美的。我也可以使用这个答案解决在我的程序中刷新 JComboBox 的问题。
      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 2013-02-11
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多