2009-08-13 9 views
0

GUI에 입력 된 매개 변수로 실행 가능한 명령 행을 실행하고 싶습니다.GUI에서 명령 행 도구 시작하기

Process 클래스는 자바 응용 프로그램에서 내 필요한 명령 행 프로세스를 포크로 사용하고, 나는 결과를 얻을 수 Process 개체의 getInputStream() 방법을 사용하고이 GUI에 표시 도착 할 수 있습니다.

private void confirmActionPerformed(java.awt.event.ActionEvent evt) {          
    String output; 
    try { 
     Process p = Runtime.getRuntime().exec("my command line exe with parameters"); 
     BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     while ((output = stdInput.readLine()) != null) { 
      TextField.setText(TextField.getText()+output+"\n"); 
     } 
    } catch (IOException e) { 
     System.out.println("Exception in Process"); 
     e.printStackTrace(); 
    } 
} 

는 버튼을 누르면 이벤트의 이벤트 리스너 내 코드와 나는 텍스트 필드의 과정 (자바 스윙 구성 요소)의 결과를 표시하려고했습니다.

이 프로세스는 실제로 오랜 기간 동안 실행되며 명령 줄에서 실행될 때 및 실행시 일부 통계를 표시하지만 위의 코드로 GUI에서 시도하면 전체 통합 결과가 프로세스 종료 실행 중. TextField이 실행 중일 때 업데이트되지 않습니다.

이 문제의 근본 원인은 무엇입니까?

답변

1

이것은 모든 것이 스윙 이벤트 처리 스레드에 의해 수행되기 때문입니다.

아마도 별도의 스레드를 만들고 SwingUtilities.invokeLater()를 사용하여 TextField를 업데이트해야 할 것입니다.

0

Maurice는 이미 지적했듯이 UI 스레드에서 집중적 인 처리를해서는 안됩니다. SwingWorker class이 도움이됩니다. 1.6 이후 표준 API의 일부입니다. 1.6을 사용할 수 없으면 backport to 1.5도 있습니다.

이 클래스를 사용하면 일부 처리 작업을 다른 스레드에 넣고 결과를 나중에 표시하여 GUI가 동시에 차단되지 않도록 할 수 있습니다. 물론 SwingUtilities.invokeLater()을 Maurice의 제안처럼 직접 사용할 수도 있습니다. 그러나 저에게있어 SwingWorker는 이런 종류의 일을하는 새로운 표준 방식 인 것처럼 쉽습니다.