2016-03-15 4 views
0

Я пытаюсь прочитать входной поток процесса, который я создаю внутри функции actionPerformed для JButton для моего интерфейса. Для этой цели я реализовал класс runnable. Проблема в том, что я получаю выходной поток в квантах, что означает, что, скажем, я получаю 50 строк, чем большая пауза, и 50 строк больше и тому подобное. Большая проблема заключается в том, что порядок строк не согласован. Вот как выглядит мой код ...Java, чтение входного потока внутри jButton actionperformed

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/печать-а-Java-InputStream-из-а-процесса/15801490 # 15801490). Вероятная причина - это вызов 'update', который вам никогда не приходилось делать – MadProgrammer

ответ

0

Короче говоря, вы не должны блокировать ввод-вывод в потоке событий. Используйте другую резьбу,

+0

Я также пробовал это. Я реализовал класс runnable и создал новый поток сразу после запуска программы. Все тот же вывод. – thisiserdinc

0

Вы должны использовать качели. Я написал пример, использующий исполнителя для выполнения ввода-вывода.

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).

+1

Просто мы 'SwingWorker', это проще и имеет функцию' publish'/'process' для безопасной синхронизации обновлений с пользовательским интерфейсом – MadProgrammer

Смежные вопросы