我的代码不能正常工作有什么问题呢? SwingWorker的

时间:2014-03-27 00:41:49

标签: java swing jtable swingworker

我的swing项目存在问题,经过很长一段时间后,我发现我遇到了并发问题。尽管如此,我对并发问题一无所知,我只是想学习。 简而言之,我的项目是一个连接到JTable的数据库。当发生诸如输入,更新和删除之类的操作时,它同时影响derby和JTable两个数据库。 我在代码中使用了SwingWorkerinvokeLater。有时它可以工作,但有些时候它不起作用。 我的代码如下 注意:我为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");
    }

}

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

1 个答案:

答案 0 :(得分:1)

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

  1. 在侦听器中调用的代码在Event Dispatch Thread上执行,因此不需要SwingUtilities.invokeLater()
  2. 出于同样的原因,您不需要同步块。
  3. 我会将所有代码放在SwingWorker中。也就是说,首先应该从数据库中删除数据(因为这是最有可能失败的功能)。如果deletete成功完成,那么我将从TableModel中删除该行。因此,您可能需要在doInBackground()方法中“发布”要删除的行。然后,在SwingWorker的process()方法中执行的代码将自动在EDT上运行。

    有关详细信息,请参阅Tasks That Have Intermediate Results