【问题标题】:Display CMD output in my GUI (java)在我的 GUI (java) 中显示 CMD 输出
【发布时间】:2010-10-14 14:57:09
【问题描述】:

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

【问题讨论】:

  • 来自"Software Monkey" 的答案应该是:stackoverflow.com/questions/342990/…>
  • 你有什么理由要使用 JLabel 而不是 JTextArea 吗?
  • 建议从这个问题中删除实时标签。实时计算的定义见en.wikipedia.org/wiki/Real-time

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


【解决方案1】:

你设置了标签的文字后repaint()了吗?

无论如何,您通常应该对在 GUI 事件线程上执行长操作感到犹豫。考虑改用SwingWorker

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 或者只是将读取进程流的代码放入单独的线程中。例如,您可能需要另一个线程来读取错误流。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多