2014-03-27 1 views
0

내 스윙 프로젝트에 문제가 있습니다. 오랜 시간이 지난 후에 동시성 문제가 있음을 발견했습니다. 그럼에도 불구하고 나는 동시성 문제에 대해 알지 못하며, 나는 단지 배우려고 노력한다. 내 프로젝트 요약집은 JTable에 연결된 데이터베이스입니다. 입력, 갱신 W h 제와 같은 일부 조작이 _ 생할 때, 더이 s의 데이터베이스와 JTable에 동시에 영향을줍니다. 코드에 SwingWorkerinvokeLater을 사용합니다. 때로는 효과가 있지만 다른 때는 작동하지 않습니다. 내 코드는 다음과 같습니다. 참고 : 을 사용해야한다고 조언하는 JTable에 대해서는 AbstractTableModel을 구현합니다. 다음 코드는 부품을 삭제하기위한 코드이며 다른 작업에도 동일한 기능을 적용 할 수 있다고 생각합니다. 맞나요?내 코드가 제대로 작동하지 않습니다. 무엇이 잘못 되었나요? 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

내가 말한대로 코드를 변경했지만 때로는 효과가 있고 때때로 그렇지 않습니다. 왠지 말해줘? –

관련 문제