在我的GUI中显示CMD输出(java)

时间:2009-03-20 18:39:36

标签: java user-interface swing cmd real-time

如何从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工作正常。我只是想实时显示输出。

3 个答案:

答案 0 :(得分:5)

在设置标签文本后是否重新绘制了()?

无论如何,您通常应该对在GUI事件线程上执行长操作犹豫不决。请考虑使用SwingWorker代替。

答案 1 :(得分:3)

您需要启动一个单独的线程来运行该过程。你用来运行它的代码大多只是插入到线程的(或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版本中)。 / p>

编辑到编辑:太傻了,我没注意到SwingWorker在另一个答案中已经提到了。

答案 2 :(得分:2)

除了其他人对多线程的说法之外 - 您还需要阅读子进程错误流。我相信(在某些情况下)如果你没有为进程消耗错误流,它可能会导致它挂起。