【问题标题】:Java, reading input stream inside jButton actionperformedJava,读取jButton actionperformed中的输入流
【发布时间】:2016-03-15 09:11:42
【问题描述】:

我正在尝试读取我在JButton 的actionPerformed 函数中为我的界面创建的进程的输入流。为此,我实现了一个可运行的类。问题是我得到了一个量子输出流,这意味着,假设我得到了 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){
  }
}

【问题讨论】:

标签: java swing inputstreamreader


【解决方案1】:

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

【讨论】:

  • 我也试过了。我实现了一个可运行的类,并在执行程序后立即创建了一个新线程。还是一样的输出。
【解决方案2】:

您应该使用摇摆工人。我已经编写了一个使用执行程序执行 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(Graphics g)。

【讨论】:

  • 给我们一个SwingWorker,它更简单,并且具有publish/process 功能,可以安全地将更新同步到 UI
猜你喜欢
  • 2021-08-23
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2011-05-29
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多