如何将swing.JTextArea绑定到PrintStream以接受数据

时间:2012-06-03 18:49:58

标签: java multithreading swing user-interface jtextarea

客户端有gui和额外的线程(处理套接字输入并将其打印出来以传递PrintStream类型的对象)。 gui表单有new javax.swing.JTextArea()。我需要传递线程对象PrintStream以写入:ClientThreadIn(PrintStream inOutput){...}。如何使用ClientThreadIn创建/绑定gui JTextArea以接受PrintStream数据格式?


客户端:

    in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
ClientThreadIn threadIn = new ClientThreadIn(in, System.out); // client passes it's System.out to thread for writing

所以JTextArea应该与console类似。它应该能够接受来自Thread的数据(实际上Thread写入gui的PrintStream)...... 有没有类似于JTextArea.getInputStream()?

的东西

1 个答案:

答案 0 :(得分:10)

一种方法是创建一个将JTextArea链接到OutputStream的类,比如名为TextAreaOutputStream,并让它扩展OutputStream。给它一个StringBuilder对象来保存它在write(int b)覆盖中构造的String,并为它提供对要写入文本的JTextArea的引用。然后当遇到换行符时,将String写入JTextArea,但一定要在Swing事件线程或EDT上执行

例如:

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 + "> ");

         return;
      }

      sb.append((char) b);
   }
}

然后将它包装在PrintStream对象中并​​让套接字使用它是微不足道的。