如何从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工作正常。我只是想实时显示输出。
答案 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)
除了其他人对多线程的说法之外 - 您还需要阅读子进程错误流。我相信(在某些情况下)如果你没有为进程消耗错误流,它可能会导致它挂起。