2016-06-16 2 views
1

Я должен выполнить оболочки COMMANDE окна из Java Swing приложение и получить результат в реальном времени:получить результат от команды оболочки на JTextArea

String cmd = jTextField1.getText(); 

StringBuffer output = new StringBuffer(); 

Process p; 
try { 
    p = Runtime.getRuntime().exec(cmd); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    String line = ""; 
    while ((line = reader.readLine()) != null) { 
     System.out.println("" + line); 
     jTextArea1.append(line + "\n"); 
    } 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

проблема заключается в том, что писать в JTextArea после выполнения отделки не в реальном масштабе времени, как System.out.println (..).

ответ

4

При обновлении свинг компонентов из-за пределов событий диспетчерское Thread (EDT), вы должны использовать либо SwingWorker или позвоните по телефону SwingUtilities.invokeLater() следующим образом:

while ((line = reader.readLine()) != null) { 
    final String appendLine = line + "\n"; 
    System.out.println("" + line); 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){  
      jTextArea1.append(appendLine); 
     } 
    }); 
} 
0

Попробуйте создать Thread и используйте Thread.sleep(), чтобы выполнить живое обновление JTextArea.

Создайте подкласс как следующий

class Work implements Runnable { 

     String cmd; 

     Work(String c) { 
      this.cmd = c; 
     } 

     @Override 
     public void run() { 
      Process p; 
      try { 
       p = Runtime.getRuntime().exec(cmd); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

       String line = ""; 
       while ((line = reader.readLine()) != null) { 
        System.out.println("" + line); 
        Thread.sleep(500); 
        jTextArea1.append(line + "\n"); 
       } 

      } catch (IOException | InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

Измените код следующим образом

String cmd = jTextField1.getText(); 
StringBuffer output = new StringBuffer(); 
new Thread(new Work(cmd)).start() 
+1

Это неправильно синхронизировано; показан лучший подход [здесь] (http://stackoverflow.com/a/37859517/230513). – trashgod

+0

@trashgod работает правильно, но не оптимизирован! – Yaz

+0

Yaz: К сожалению, это не [надежный] (http://stackoverflow.com/a/7158505/230513). – trashgod

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