Java,读取jButton actionper形成的输入流

时间:2016-03-15 09:11:42

标签: java swing inputstreamreader

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

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){
  }
}

2 个答案:

答案 0 :(得分:0)

简而言之,您不应该在事件线程中执行任何阻塞I / O.使用另一个线程,

答案 1 :(得分:0)

你应该使用摇摆工人。我编写了一个使用执行程序来执行IO的示例。

SELECT t1.ID, COALESCE(t2.ID, '') AS CID, COALESCE(t2.VAL, '')
FROM tableA t1 LEFT JOIN tableA t2
    ON t1.ID = t2.CID
WHERE t1.CID IS NULL

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

ExecutorService executor = newSingleThreadExecutor()

SwingWorker类负责从EDT开始工作并允许您发布工作。这种情况更合适。

你不应该使用.update(Graphics g)。