有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从GUI启动命令行工具

我想用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();
    }
}   

这是我的代码,它是一个按钮按下事件的事件监听器,我试图在文本字段(JavaSwing组件)中显示该过程的结果

这个过程实际上运行了相当长的一段时间,并在命令行中运行时显示了一些统计信息,但当我尝试在GUI中使用上述代码时,只有在该过程完成运行后,我才能获得整个合并结果。我不会在执行时更新TextField

这个问题的原因是什么


共 (2) 个答案

  1. # 1 楼答案

    正如Maurice已经指出的,您不应该在UI线程上进行密集处理。{a1}有助于实现这一点。从1.6开始,它就是标准API的一部分。如果不能使用1.6,还有一个backport to 1.5

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

  2. # 2 楼答案

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

    也许你应该考虑创建一个单独的线程,并用SWIVITUTE更新TeXField.调用器()