代码之家  ›  专栏  ›  技术社区  ›  Glenn

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

  •  5
  • Glenn  · 技术社区  · 16 年前

    我如何从一个命令进程中获取输出以显示在我的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完全被锁定,所以直到最后才进行任何更新,这不是很有用。除此之外,命令运行良好。我只想实时显示输出。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Michael Myers KitsuneYMG    16 年前

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

    无论如何,对于在GUI事件线程上执行一个长的操作,您通常应该有所犹豫。研究如何使用 SwingWorker 相反。

        2
  •  3
  •   David Z    16 年前

    您需要启动一个单独的线程来运行该进程。您用来运行它的代码主要可以插入线程(或 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版本中)。

    编辑到编辑 太傻了,我没注意到 摇摆工人 在另一个答案中已经提到。

        3
  •  2
  •   Eric Petroelje    16 年前

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