2016-03-15 62 views
0

我正在尝试读取我为界面创建的一个actionPerformed函数的函数中的输入流。为此,我实现了一个可运行的类。问题是我得到了一个量子输出流,这意味着,可以说我得到了50行,而不是一个大的停顿,还有50行等等。更大的问题是线的顺序不一致。这里是我的代码看起来像...Java,在jButton中执行读取输入流操作执行

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) 
{ 
    try{ 
    String sCommand = "cmd /c \"myenvsetup.bat && myprogram.exe\""; 
    Runtime rt = Runtime.getRuntime(); 
    pr = rt.exec(sCommand); 
    java.awt.EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
     try{ 
      BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
      String line = null; 
      while((line = input.readLine()) != null){ 
      jTextArea1.append(line + "\n"); 
      jTextArea1.scrollRectToVisible(new Rectangle(0, jTextArea1.getHeight(), 0, 0)); 
      jTextArea1.update(jTextArea1.getGraphics()); 
      } 
      pr.waitFor(); 
     } catch (Exception e) { 
     } 
     } 
    }); 
    } catch (Exception e){ 
    } 
} 
+1

对于[示例](http://stackoverflow.com/questions/30797851/update-jlabel-content-from-the-output-of-shell-script/30798684#30798684),[示例](http:///stackoverflow.com/questions/34858405/how-can-i-make-this-method-update-the-gui-within-my-loop/34864911#34864911),[示例](http://stackoverflow.com/问题/ 15801069 /印刷-A-java的InputStream的从 - 一个过程/ 15801490#15801490)。可能的原因是对'update'的调用,你应该不必这么做 – MadProgrammer

回答

0

总之,你不应该在事件线程中做任何阻塞I/O。使用另一个线程,

+0

我也试过了。我实现了一个可运行的类,并在执行程序后创建了一个新线程。仍然是相同的输出。 – thisiserdinc

0

你应该使用一个swing工作者。我写了一个使用执行程序来执行IO的示例。

ExecutorService executor = newSingleThreadExecutor() 

此示例的目的是显示您在执行程序线程上的工作,然后将更改发布到EDT。

try { 
    String sCommand = "cmd /c \"myenvsetup.bat && myprogram.exe\""; 
    Runtime rt = Runtime.getRuntime(); 
    pr = rt.exec(sCommand); 
    executor.submit(new Runnable() { 
     public void run(){ 
     try{ 
      BufferedReader input = new BufferedReader(
       new InputStreamReader(pr.getInputStream()) 
      ); 
      String line = null; 
      while((line = input.readLine()) != null){ 
       final String l = line; 
       EventQueue.invokeLater(new Runnable(){ 
        @Override 
        public void run(){ 
        jTextArea1.append(l + "\n"); 
        jTextArea1.scrollRectToVisible(
         new Rectangle(0, jTextArea1.getHeight(), 0, 0) 
        ); 
        jTextArea1.repaint(); 
       } 
       }); 
       } 
       pr.waitFor(); 
     } catch (Exception e) {} 
     } 
    }); 
} catch (Exception e){ 
} 

SwingWorker类负责完成EDT的工作并允许您发布工作。这种情况更适合。

而且你不应该使用.update(图形g)。

+1

只要我们一个'SwingWorker',它就更简单了,并且具有'publish' /'process'功能来安全地同步更新到UI – MadProgrammer