1

안녕하세요, 저는 Java 프로그래밍에 익숙하지 않습니다. Java에서 외부 명령을 실행하고 JTextArea in real time에 명령 프롬프트 출력을 표시하려고합니다. 이 외부 프로그램은 1 초마다 1 줄의 출력을 생성 한 다음 10 초 후에 종료합니다.내 코드가 JTextArea를 실시간으로 업데이트하지 못하는 이유는 무엇입니까?

original codes have been deleted to save space after reading Kumra's answer

내가 명령 프롬프트 창에은 Program.exe 수동으로 실행, 출력은 다음과 같이 실시간으로 업데이트됩니다 :

<some warning message of the .exe program 
    which should not affect the output of the program> // shown at t=0 
output line 1 //shown at t=1 
output line 2 //shown at t=2 
output line 3 //shown at t=3 
output line 4 //shown at t=4 
output line 5 //shown at t=5 
output line 6 //shown at t=6 
output line 7 //shown at t=7 
output line 8 //shown at t=8 
output line 9 //shown at t=9 
output line 10 //shown at t=10 

Done. //shown at t=10. 

때 다음

내 자바 코드입니다 위의 Java 프로그램을 실행하면 JTextArea가 실시간으로 업데이트되어 명령 프롬프트 출력을 볼 수 있다고 생각했습니다. 불행히도 작동하지 않습니다. 실제 출력은 다음과 같습니다.

<some warning message of the .exe program 
    which should not affect the output of the program> // shown at t=0 

t = 0에서 t = 10까지, JTextArea는 위 출력에서 ​​멈추게됩니다. t = 11에서 갑자기 완전한 출력이 표시됩니다.

<some warning message of the .exe program 
    which should not affect the output of the program> // shown at t=0 
output line 1 //shown at t=11 
output line 2 //shown at t=11 
output line 3 //shown at t=11 
output line 4 //shown at t=11 
output line 5 //shown at t=11 
output line 6 //shown at t=11 
output line 7 //shown at t=11 
output line 8 //shown at t=11 
output line 9 //shown at t=11 
output line 10 //shown at t=11 

Done. //shown at t=11 

내 코드의 문제점을 알고 있습니까? 누구든지 JTextArea에서 명령 프롬프트 출력을 표시하는 방법을 가르쳐 줄 수 있습니까 in real time? 감사.

편집 1 :
내가 쿠마의 답변에 따라 코드를 편집 한하지만 여전히 작동하지 않습니다. 최신 코드는 다음과 같습니다.

MyUI.java

public class MyUI extends JFrame 
implements ActionListener, KeyListener, ChangeListener, WindowListener 
{ 
    ... 
    private JTextArea output; 

    public void showMessage(String message) 
    { 
     output.append(message + "\n"); 
     output.setCaretPosition(output.getDocument().getLength()); 
    } 
    ... 

    public void actionPerformed(final ActionEvent e) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       if (xxxxx) 
       { 
        myThreadInstance = new MyThread(xx,xxx,xx,xx,xx); 
        myThreadInstance.start(); 
       } 
      } 
     } 
    } 

} 

MyThread.java

public class MyThread extends Thread 
{ 
    ... 
    public MyUI myFrame; 
    ... 

    public void run 
    { 
     try 
     { 
      String command = "program.exe arg1 arg2 arg3 arg4"; 

      List<String> items = Arrays.asList(command.split("\\s+")); 

      builder = new ProcessBuilder(items); 
      builder.redirectErrorStream(true); 

      process = builder.start(); 

      input = new BufferedReader(new InputStreamReader(process.getInputStream())); 

      String inputline = null; 
      while ((inputline = input.readLine()) != null) 
      { 
       myFrame.showMessage(inputline); 
      } 
     } 
     catch(){} 
     finally{} 
    } 
} 

답변

2

이 시도 ...

  1. 항상 UI 스레드와 비 UI 작업에 UI 작업에 계속 비 UI 스레드
  2. 이벤트 발송자 스레드는 GUI 스레드를 담당하는 UI 스레드입니다.
  3. UI 스레드에서 t = 0에서 t = 10까지 계산하는 과정입니다. 이유는 은 t = 11까지 출력이 표시되지 않습니다.
  4. 는 cmd를에 계산을 할 수있는 별도의 스레드을 만들거나 UI와 비 UI 스레드를 동기화 할 스윙에서 제공 SwingWorker를 사용합니다.
+0

안녕하세요. 쿠마 (Kumar), 답변을 기반으로 코드를 편집했습니다 (올바르게 해석하면). 하지만 여전히 작동하지 않습니다. 새 코드를 확인하고 지침을 줄 수 있습니까? 감사. – userpal

+0

현재 저는 직장에 있습니다. 집에 갈 때 나는 그것을 보려고 노력할 것입니다 .... –

관련 문제