从GUI启动命令行工具

时间:2009-08-13 08:56:46

标签: java user-interface swing command-line textarea

我想使用GUI中输入的参数触发可执行的命令行。

Process类可用于从Java应用程序派生我所需的命令行进程,并使用getInputStream()对象的Process方法获取结果并将其显示在GUI。

private void confirmActionPerformed(java.awt.event.ActionEvent evt) {                                       
    String output;
    try {
        Process p = Runtime.getRuntime().exec("my command line exe with parameters");
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

        while ((output = stdInput.readLine()) != null) {
            TextField.setText(TextField.getText()+output+"\n");
        }
    } catch (IOException e) {
        System.out.println("Exception in Process");
        e.printStackTrace();
    }
}   

这是我的代码,它是按下按钮事件的事件监听器,我试图在文本字段(java swing组件)中显示进程的结果。

这个过程实际上运行了很长时间,并在命令行中运行时显示了一些统计信息,但是当我在GUI中使用上面的代码尝试它时,我只在进程后得到整个合并结果完成运行。我没有及时更新TextField

这个问题的原因是什么?

2 个答案:

答案 0 :(得分:1)

这是因为整个事情都是由Swing事件处理线程完成的。

也许您应该考虑创建一个单独的线程并使用SwingUtilities.invokeLater()更新TextField。

答案 1 :(得分:0)

正如Maurice已经指出的那样,你不应该在UI线程上进行密集处理。 SwingWorker class对此有所帮助。它是1.6以来标准API的一部分。如果您不能使用1.6,还有backport to 1.5

这个类使得更容易将一些处理任务放在另一个线程上并稍后显示结果,这样你的GUI就不会在此期间阻塞。当然,你也可以直接使用SwingUtilities.invokeLater(),正如莫里斯所建议的那样,但对我来说,SwingWorker是一种可行的方式,因为它非常简单,显然是做这种事情的新标准方法。