5

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

4

3 回答 3

5

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

无论如何,您通常应该对在 GUI 事件线程上执行长时间操作感到犹豫。考虑使用 aSwingWorker代替。

于 2009-03-20T18:44:39.993 回答
3

您需要启动一个单独的线程来运行该进程。您用来运行它的代码大部分可以按原样插入到线程的(或Runnablerun()方法中,但是要在 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另一个答案中已经提到过。

于 2009-03-20T18:49:51.977 回答
2

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

于 2009-03-20T18:54:34.180 回答