Java Swing:JTable不';在鼠标单击任何位置之前是否更新?

Java Swing:JTable不';在鼠标单击任何位置之前是否更新?,java,swing,jdbc,jtable,Java,Swing,Jdbc,Jtable,我只是在编写与数据库(MySQL)交互的应用程序代码。为了使用数据库,我在Swing中一切正常 刷新代码: 最后,我编写了一些代码来刷新JTable中的数据,以反映数据库中的实际数据 这在这样的场景中很有用。如果我向JTable中添加了一条新记录,通常会将该记录添加到基础数据库中。但如果我添加了一条与现有记录重复的记录,底层数据库将不会插入它,但它将显示在JTable中(在实际数据库中没有相应的记录) 要刷新的代码具有从数据库获取新数据的任务。它可以正常工作,但不会影响(更新/刷新)表,直到我在

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

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

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

要刷新的代码具有从数据库获取新数据的任务。它可以正常工作,但不会影响(更新/刷新)表,直到我在JTable中的任意位置单击鼠标

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

“但是,如果我添加了一条与现有记录重复的记录,底层数据库将不会插入它,但它将显示在JTable中……如何在不戳它的情况下正确更新swing组件?”

  • -返回一个
    int
    ,即数据库中更新的行数
这样,您就可以检查结果是否为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");
}
如何使swing组件在不戳它的情况下正确更新

  • 使用更改直接更新TableModel
  • 确保在事件分派线程上完成对模型的更新
  • 访问数据库的代码应该在非EDT线程上完成,这样就不会阻止GUI响应事件。因此,您可能应该为此代码使用SwingWorker。然后发布结果,以便可以在EDT上更新模型


    有关详细信息,请阅读Swing教程中的部分。

    因此,如果数据成功插入数据库,您只希望更新表?在TableModel中,您的结构不应允许重复,一个好的解决方案是使用
    ,您必须覆盖
    行实体中的
    equals
    hashCode
    ,数据库更新应在非EDT线程上完成。TableModel更新应在EDT上完成。