【问题标题】:Initiating a commandline tool from GUI从 GUI 启动命令行工具
【发布时间】:2009-08-13 08:56:45
【问题描述】:

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

Process 类可用于从 Java 应用程序派生我所需的命令行进程,我使用 Process 对象的 getInputStream() 方法获取结果并将其显示在 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 在执行时没有更新。

这个问题的原因是什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多