我怎么可能会从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