2012-10-18 3 views
0

음성 인식 구성 요소를 기존 응용 프로그램과 통합하는 과정에 있습니다. 내 응용 프로그램에는 JTree와 JTextPane이 있습니다. 나는 JTree를위한 jtextpane과 selection 이벤트 핸들러를위한 포커스 이벤트 핸들러를 잃어버린 것으로 쓴 적이있다. 포커스가 jtextpane에있을 때 jtree에서 노드를 선택하면 포커스 손실 이벤트 핸들러 앞에 선택 이벤트 핸들러가 실행되는 것을 볼 수 있습니다. 포커스 손실 이벤트 핸들러에 ThreadPoolExecutor를 작성했으며 ThreadPoolExecutor에 세 가지 작업을 추가합니다. 선택 핸들러를 실행하기 전에 반드시 ThradPoolExecutor의 모든 작업을 완료해야합니다. 그 때문에 countdownlatch를 사용합니다. 비슷한 게시물을 많이 읽었지만 선택 이벤트 처리기를 실행하기 전에 포커스 손실을 보장하는 방법을 찾지 못했습니다. 일부 게시물 invokeLater 메서드에서 선택 이벤트 처리기 코드를 실행하도록 요청했다. 하지만 ThreadPoolExecutor는 다른 스레드에서 해당 코드를 실행하므로 내 문제의 해결책은 아닙니다. 나는 내 코드를 실행할 순서를 기록해이 아래자바 손실 포커스 이벤트 처리기가 다른 이벤트 처리기를 실행하기 전에 작업을 완료하는 방법

  1. 초점을 잃은 이벤트 핸들러
  2. 블록 UI 스레드에 ThreadPoolExecutor에 잃어버린 포커스 이벤트에 ThreadPoolExecutor에 모든 추가 작업을 완료하는 작업을 추가합니다.
  3. 선택 이벤트 처리기를 실행하십시오. 다음은

는 선택 이벤트는 이제까지 focusLost() 이벤트와 제휴하여 발생하는 경우

public void focusLost(FocusEvent e) 
    { 

    if (ecaControl.isInitialized()) 
    { 

     ecaControl.addStopRecordingJobToExecutor(); 

     ecaControl.addSaveJobToExecutor(this.currentMetaFileName != null ? this.currentMetaFileName : this.getName()); 

     ecaControl.addCloseJobToExecutor(); 

     co = new CountDownLatch(ecaControl.getExecutor().counter); 
     ecaControl.getExecutor().setCountdownla(co); 

     try 
     { 
     System.out.println("------- count before" + ecaControl.getExecutor().counter); 
     co.await(); 

     ecaControl.getExecutor().setCountdownla(null); 
     } 
     catch (InterruptedException e1) 
     { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
     } 
     System.out.println("--------count after" + ecaControl.getExecutor().counter); 
     try 
     { 
     System.out.println("The text is " 
      + this.getStyledDocument().getText(0, getStyledDocument().getLength())); 
     } 
     catch (BadLocationException e1) 
     { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
     } 

    } 

    } 

답변

0

, 다음에 invokeLater() 메소드를 호출 한 후 ThreadPoolExecutorawaitTermination()를 호출해야 내 초점 핸들러의 코드를 작성한다 선택 이벤트 그렇지 않다면 최상의 솔루션은 아마도 이벤트 디스패처 일 것입니다. 모든 이벤트를 이벤트 디스패처로 보낸 경우 JTree이 기다려야하는지 여부를 조정하고 필요한 모든 스레드를 실행 한 다음 적절한 시간에 해당 구성 요소에 이벤트를 다시 전달할 수 있습니다.

관련 문제