gpt4 book ai didi

java - 我的代码无法正常工作,有什么问题吗? Swing worker

转载 作者:行者123 更新时间:2023-12-01 13:13:11 26 4
gpt4 key购买 nike

我的 Swing 项目有问题,经过很长时间,我发现我有并发问题。尽管如此,我对并发问题一无所知,我只是尝试学习。简而言之,我的项目是一个连接到 JTable 的数据库。当一些操作如输入、更新和删除发生时,它会同时影响derby 和JTable 数据库。我在代码中使用 SwingWorkerinvokeLater 。有时它有效,但有时则不起作用。我的代码如下注意:我为我的 JTable 实现了 AbstractTableModel,我建议我应该使用 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");
}

}

请友善地帮助找出我的问题所在。如果您需要我提供更多信息,请通知我。

最佳答案

您在 ActionListener 中的基本代码过于复杂。

  1. 监听器内调用的代码在事件调度线程上执行,因此不需要 SwingUtilities.invokeLater()
  2. 出于同样的原因,您不需要同步块(synchronized block)。

我会将所有代码放在 SwingWorker 中。也就是说,首先您应该从数据库中删除数据(因为这是最有可能失败的功能)。如果删除成功完成,那么我将从 TableModel 中删除该行。因此,您可能需要在 doInBackground() 方法中“发布”要删除的行。然后,SwingWorker 的 process() 方法中执行的代码将自动在 EDT 上运行。

参见Tasks That Have Intermediate Results了解更多信息。

关于java - 我的代码无法正常工作,有什么问题吗? Swing worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com