我的swing项目存在问题,经过很长一段时间后,我发现我遇到了并发问题。尽管如此,我对并发问题一无所知,我只是想学习。
简而言之,我的项目是一个连接到JTable
的数据库。当发生诸如输入,更新和删除之类的操作时,它同时影响derby和JTable
两个数据库。
我在代码中使用了SwingWorker
和invokeLater
。有时它可以工作,但有些时候它不起作用。
我的代码如下
注意:我为AbstractTableModel
实施了JTable
,我建议我应该使用DefualtTableModel
。
以下代码用于删除部分,我想我可以为其他操作应用相同的功能。
我是对的吗?
private void deleteJBActionPerformed(java.awt.event.ActionEvent evt) {
deleteDB = new DeleteDB();
deleteDB.execute();
}
class DeleteDB extends SwingWorker<Void, Void> {
@Override
public Void doInBackground() {
try {
ed.deleteQuery(name1);
} catch (SQLException ex) {
Logger.getLogger(MyFrame.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("deleteing isuse is " + ex);
}
return null;
}
@Override
public void done() {
if (jTable1.getSelectedRow() >= 0) {
tm.removeRow(jTable1.getSelectedRow());
} else {
System.out.println("nothing is selected");
}
name.setText("");
tel.setText("");
ed.printData();
JOptionPane.showMessageDialog(null, "Task completed");
}
}
请善待并帮助找出我的问题所在。 如果您需要我的更多信息,请通知我。
答案 0 :(得分:1)
ActionListener中的基本代码过于复杂。
我会将所有代码放在SwingWorker中。也就是说,首先应该从数据库中删除数据(因为这是最有可能失败的功能)。如果deletete成功完成,那么我将从TableModel中删除该行。因此,您可能需要在doInBackground()方法中“发布”要删除的行。然后,在SwingWorker的process()方法中执行的代码将自动在EDT上运行。
有关详细信息,请参阅Tasks That Have Intermediate Results。