문제

CMD 프로세스에서 출력을 GUI에 표시 할 수있는 방법은 무엇입니까? 프로세스를 실행하는 데 사용하는 코드입니다.

try {
    String line;
    Process p = Runtime.getRuntime().exec("cmd /c \"e:\\folder\\someCommands.cmd\"");
    BufferedReader input =
            new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((line = input.readLine()) != null) {
        System.out.println(line);
    }
    input.close();
} catch (Exception err) {
    err.printStackTrace();
}

나는 이것을 시도했다 :

jLabel1.setText(line);

... 그러나 프로세스가 실행되는 동안 GUI가 완전히 잠겨 있으므로 끝까지 업데이트되지 않아 유용하지 않습니다. 그 외에는 CMD가 잘 작동합니다. 출력을 실시간으로 표시하고 싶습니다.

도움이 되었습니까?

해결책

레이블의 텍스트를 설정 한 후 ()를 다시 칠 했습니까?

어쨌든, 당신은 일반적으로 GUI 이벤트 스레드에서 긴 작업을 실행하는 것을 주저해야합니다. 사용을 살펴보십시오 SwingWorker 대신에.

다른 팁

프로세스를 실행하려면 별도의 스레드를 시작해야합니다. 실행하는 데 사용하는 코드는 주로 스레드에 삽입 될 수 있습니다 (또는 Runnable'에스) run() 그대로 방법이지만 jlabel에서 텍스트를 설정하려면 다음과 같은 것을 사용해야합니다.

...
while ((line = input.readLine()) != null) {
    SwingUtilities.invokeLater(new SetTextRunnable(jLabel1, line));
}
...

class SetTextRunnable implements Runnable {
    private String line;
    private JLabel jLabel1
    public SetTextRunnable(JLabel jLabel1, String line) {
        this.jLabel1 = jLabel1;
        this.line = line;
    }
    public void run() {
        jLabel1.setText(line);
    }
}

편집하다: 방금 무언가를 알아 차렸다 : 분명히 수업 SwingWorker 이런 종류의 물건을 위해 설계되었으므로 그것은 당신을위한 또 다른 옵션입니다 (Java 버전에 존재하는 경우).

편집에 편집: 너무 어리석은데, 나는 눈치 채지 못했습니다 SwingWorker 이미 다른 대답에서 언급되었습니다.

다른 사람들이 멀티 스레딩에 대해 말한 것 외에도, 당신은 또한 아동 프로세스 오류 스트림을 읽고 싶을 것입니다. (경우에 따라) 프로세스의 오류 스트림을 배출하지 않으면 매달릴 수 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top