Swing:JTable不会更新,直到在任何地方点击鼠标?

时间:2014-01-07 16:35:32

标签: java swing jdbc jtable

我正在编写与数据库(MySQL)交互的应用程序代码。我在Swing中使一切正常,可以使用数据库。

刷新代码:
最后,我写了一些代码来刷新JTable中的数据,以反映数据库中的实际数据。

这在这样的场景中很有用。如果我向JTable添加了新记录,通常会将此记录添加到基础数据库中。但是如果我添加了一个复制现有记录的记录,底层数据库将不会插入它,但它将显示在JTable中(在真实数据库中没有相应的记录)。

要刷新的代码具有从数据库获取新数据的作业。它工作正常,但它不影响(更新/刷新)表,直到我在JTable中的任何地方单击鼠标。

如何在不戳戳的情况下正确更新swing组件。

2 个答案:

答案 0 :(得分:0)

  

"但是如果我添加了一个复制现有记录的记录,底层数据库将不会插入它,但它将显示在JTable中......如何正确更新swing组件戳它?"

如上所述,您可以检查结果是否为0.如果不是,则仅在插入成功时才将行添加到表中。像这样的东西

String text1 = textfield1.getText();
String text2 = textfield2.getText();
String text3 = textfield3.getText();

PreparedStatement ps = conn.prepareStatement("INSERT into table1 values (?, ?, ?)");
ps.setString(1, text1);
ps.setString(2, text2);
ps.setString(3, text3);

int result = ps.executeUpdate();    // check for rows affected

if (result != 0 ) {                 // only if result != 0 do we update the table
    DefaultTableModel model = (DefaultTableModel)jTable.getModel();
    Object[] row = { text1, text2, text3 };
    model.addRow(row);
} else {
    someStatusLabel.setText("That record already exists in the Database");
}

答案 1 :(得分:0)

  

如何在不戳戳的情况下正确更新swing组件。

  1. 直接使用更改
  2. 更新TableModel
  3. 确保在事件调度线程上完成对模型的更新。
  4. 访问数据库的代码应该在非EDT线程上完成,这样就不会阻止GUI响应事件。所以你可能应该使用SwingWorker来代码。然后发布结果,以便可以在EDT上更新模型。

    阅读Concurrency上的Swing教程中的部分以获取更多信息。