2014-05-15 1 views
0

안녕하세요, 아래 메소드에서 나중에 메소드를 호출하지만 여전히 다음 버튼을 클릭 한 후 닫기 버튼에서 응답을받을 수 없습니다. 내 코드에서 hte 실수를 지적하십시오. 또는 내가 예상 한 동작이 잘못되었는지 알려주십시오.swing의 invokeLater 메소드

public void actionPerformed(ActionEvent e) { 
//Some log messgae 
    if (e.getSource() == btnNext) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run(){ 

/// some piece of code for some database transaction 

      } 
     }); 

    } 

은 내가 btnNExt 클릭하면 아직도 내가 그것의 데이터베이스 트랜잭션을 수행 할 때 사이에서 응용 프로그램을 종료 할 수 있어야한다고 여기 기대합니다. 어떤 일이 일어나지 않았습니까?

여기에 문제가 있거나 코드별로 문제가 있다고 생각합니다.

+0

invokeLater는 swing 이벤트 스레드에서 실행되며 실행 중에 UI가 고정됩니다. 데이터베이스 트랜잭션 코드가 UI를 견지하고 있으며 별도의 스레드에서 실행 중이어야합니다. 스윙 코드가 없으면 invokeLater로 실행하지 마십시오. – schmop

+1

데이터베이스 코드에 invokeLater 대신 SwingWorker를 사용하십시오. –

답변

0

예상 한 바가 잘못되었습니다.

SwingUtilities.invokeLater는 비동기 적으로 작업을 시작하지 않고 버튼 이벤트 핸들러가 반환 된 후에 시작합니다 (대기열에 다른 EDT 이벤트가없는 경우). 그래서 기본적으로 앱이 GUI 이벤트.

비동기 적으로 작업하려면 스레드를 사용해야합니다. 예를 들어 SwingWorker 클래스를 참조하십시오. 그러나 데이터베이스 작업이 일부 데이터를 반환하거나 UI에서 작업을 수행한다고 생각합니다. (데이터베이스에서만 데이터를 삭제하는 경우가 아니면)

아무 것도 업데이트하지 않기 때문에 다른 문제가 발생합니다. 다른 스레드에서 GUI에. 여기서 db 스레드에서 SwingUtilities.invokeAndWait를 호출하여 GUI에서 무언가를 업데이트 할 수 있습니다.

관련 문제