Как отобразить вывод команды оболочки на jtextarea в Java? - PullRequest
2 голосов
/ 17 апреля 2011

Как отобразить вывод команды оболочки на jtextarea в java?

Пожалуйста, помогите Спасибо

Ответы [ 3 ]

2 голосов
/ 17 апреля 2011

Вам необходимо прочитать стандартный вывод как поток ввода процесса и обновить JTextArea, используя очередь событий из другого потока.Смотрите пример кода ниже:

public class OutputDisplayer implements Runnable {

protected final JTextArea textArea_;
protected Reader reader_ = null;

public OutputDisplayer(JTextArea textArea) {
    textArea_ = textArea;
}

public void commence(Process proc) {
    InputStream in = proc.getInputStream();
    reader_ = new InputStreamReader(in);
    Thread thread = new Thread(this);
    thread.start();
}

public void run() {
    StringBuilder buf = new StringBuilder();
    try {
        while( reader_ != null ) {
            int c = reader_.read();
            if( c==-1 ) return;

            buf.append((char) c);
            setText( buf.toString() );
        }
    } catch ( IOException ioe ) {
        buf.append("\n\nERROR:\n"+ioe.toString());
        setText( buf.toString() );
    } finally {
        try {
            reader_.close();
        } catch ( IOException ioe ) {
            ioe.printStackTrace();
        }
    }
}


private void setText(final String text) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            textArea_.setText(text);
        }
    });
}
}   
2 голосов
/ 17 апреля 2011

В дополнение к моим двум ссылкам в моих комментариях выше, я создал и использовал TextAreaOutputStream, который помогает перенаправить данные выходного потока в текстовую область:

import java.io.IOException;
import java.io.OutputStream;

import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class TextAreaOutputStream extends OutputStream {

   private final JTextArea textArea;
   private final StringBuilder sb = new StringBuilder();
   private String title;

   public TextAreaOutputStream(final JTextArea textArea, String title) {
      this.textArea = textArea;
      this.title = title;
      sb.append(title + "> ");
   }

   @Override
   public void flush() {
   }

   @Override
   public void close() {
   }

   @Override
   public void write(int b) throws IOException {

      if (b == '\r')
         return;

      if (b == '\n') {
         final String text = sb.toString() + "\n";
         SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               textArea.append(text);
            }
         });
         sb.setLength(0);
         sb.append(title + "> ");
      }

      sb.append((char) b);
   }
}
2 голосов
/ 17 апреля 2011

Вы можете получить вывод команды оболочки ниже кода фрагмента, включив jtextarea во время цикла.

    try {
        String cmd = "java";  // Set shell command
        Process child = Runtime.getRuntime().exec(cmd);

        InputStream lsOut = child.getInputStream();
        InputStreamReader r = new InputStreamReader(lsOut);
        BufferedReader in = new BufferedReader(r);

        // read the child process' output
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
            // You should set JtextArea
        }
    } catch (Exception e) { // exception thrown

        System.err.println("Command failed!");

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...