2009-08-13 45 views
0

我想启动一个可在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(); 
    } 
} 

这是我的代码,其是一个按钮按下事件的事件侦听器和我试图显示在文本字段中的处理(的Java Swing成分)的结果。

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

这个问题的原因是什么?

回答

1

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

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

0

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

该类可以更轻松地将某些处理任务放在另一个线程上,并在稍后显示结果以便GUI不会在此期间阻塞。当然,您也可以按照Maurice的建议直接使用SwingUtilities.invokeLater(),但对于我来说,SwingWorker是一种非常容易的方式,显然是做这种事情的新标准方式。