2014-03-27 31 views
0

我的swing項目出現問題,經過很長時間,我發現我有一個併發問題。儘管如此,我對併發性問題一無所知,我只是試圖學習。 我的項目簡而言之就是一個連接到JTable的數據庫。當發生諸如輸入,更新和刪除等操作時,它同時影響德比數據庫和JTable。 我在我的代碼中使用了SwingWorkerinvokeLater。有時它可以工作,但有些時候它不起作用。 我的代碼如下 注:我執行AbstractTableModel爲我的JTable,我建議我應該使用DefualtTableModel。 下面的代碼是用於刪除部分,我認爲我可以爲其他操作應用相同的功能。 我說得對嗎?我的代碼無法正常工作它有什麼問題? SwingWorker

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

您在ActionListener中的基本代碼過於複雜。偵聽器中調用

  1. 代碼執行,在事件指派線程,因此沒有必要對SwingUtilities.invokeLater()
  2. 你不需要同步塊一樣的道理。

我會把所有的代碼放在SwingWorker中。也就是說,首先應該從數據庫中刪除數據(因爲這是最有可能失敗的功能)。如果deletete成功完成,那麼我將從TableModel中刪除該行。所以你可能需要在doInBackground()方法中「發佈」你想要刪除的行。然後,在SwingWorker的process()方法中執行的代碼將自動在EDT上運行。

查看Tasks That Have Intermediate Results瞭解更多信息。

+0

我將代碼更改爲您所說的內容,但它有時可以工作,有時不會。你能告訴我爲什麼嗎? –

相關問題