2016-09-20 6 views
-2

Я успешно сделал это, когда пользователь нажимает кнопку, запускается оператор командной строки, и они могут видеть его вывод.Командная строка в Java-выводах

Однако они могут видеть результат только после завершения команды.

Я собирался, чтобы пользователь увидел выходные данные в реальном времени, как если бы они использовали командную строку в окнах.

Могу ли я получить руководство относительно того, как это сделать?

Код:

Runtime runtime = Runtime.getRuntime(); 
       try 
       { 
        process = runtime.exec("ping riot.de"); 
       } 
       catch (IOException e1) 
       { 
        System.err.print("Error: " + e1); 
        e1.printStackTrace(); 
       } 
       try 
       { 
        StringBuilder sb = new StringBuilder(); 
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
        String line; 
        while ((line = br.readLine()) != null) 
        { 
         sb.append(line); 
         sb.append("\n"); 
        } 
        run.setText(sb.toString()); 
       } 
       catch (IOException e) 
       { 
        System.err.println("Error: " + e); 
       } 

EDIT - Изготовлена ​​новая нить и пытаемся использовать SwingUtilities.invokeLater Это позволяет видеть компоненты кадров при его работе, однако он по-прежнему оленьей коже записи в TEXTAREA построчно.

Runtime runtime = Runtime.getRuntime(); 
       try 
       { 
        process = runtime.exec("ping riot.de"); 
       } 
       catch (IOException e1) 
       { 
        System.err.print("Error: " + e1); 
        e1.printStackTrace(); 
       } 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        try 
        { 
         StringBuilder sb = new StringBuilder(); 
         BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
         String line; 
         while ((line = br.readLine()) != null) 
         { 
          sb.append(line); 
          sb.append("\n"); 
          run.setText(sb.toString()); 
         } 
        } 
        catch (IOException e) 
        { 
         System.err.println("Error: " + e); 
        } 
       } 
      }); 
+0

Каков тип переменной 'run', в' run.setText (sb.toString()); '? – jrahhali

+2

Как насчет ввода 'run.setText (sb.toString());' внутри цикла while? – Plirkee

+0

@jrahhali Это JTextArea – Plumel

ответ

0

Качели использует однопоточных модель, так что вы читаете блоки GUI поток и ни одно событие не отправляется, и текст не оказал, пока он не свободен.

Вы должны создать новый поток и поместить все его чтение и обновить текст JTextArea в цикле с помощью SwingUtilities.invokeLater.

Вы также можете использовать SwingWorker.

+0

Я постараюсь сделать это и вернуться к вам. - Я еще не занимался потоками в Java/Swing, так что это может занять некоторое время. – Plumel

+0

Не могли бы вы сообщить мне, если я сделаю это правильно в своем редактировании? – Plumel

+0

Вы должны вызвать thread.start() и wrap run.setText (sb.toString()); в SwingUtilities.invokeLater (новый Runnable() {...}); См. Пример здесь http://stackoverflow.com/questions/12077245/what-is-swingutilities-invokelater – ike3