Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将swing.JTextArea绑定到PrintStream以接受数据_Java_Multithreading_Swing_User Interface_Jtextarea - Fatal编程技术网

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

Java 如何将swing.JTextArea绑定到PrintStream以接受数据,java,multithreading,swing,user-interface,jtextarea,Java,Multithreading,Swing,User Interface,Jtextarea,客户端有gui和额外的线程(用于处理套接字输入并将其打印到PrintStream类型的Pass对象)。gui表单具有新的javax.swing.JTextArea()。我需要传递到线程对象PrintStream以写入:ClientThreadIn(PrintStream inOutput){…}。如何使用PrintStream创建/绑定gui JTextArea以接受数据表单ClientThreadIn 客户: in = new BufferedReader(new InputStre

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


客户:

    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应该类似于控制台。它应该能够接受来自线程的数据(实际上是线程写入gui的PrintStream)。。。
有没有类似于JTextArea.getInputStream()的东西?

一种方法是创建一个类,将JTextArea链接到一个OutputStream,比如称为TextAreaOutputStream,并让它扩展OutputStream。给它一个StringBuilder对象,以保存它在
write(intb)
覆盖中构造的字符串,并给它一个要向其写入文本的JTextArea的引用。然后,当遇到新行字符时,将字符串写入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对象中并让套接字使用它是很简单的。

@RCola:这不是必需的。这就是我在我的一个程序中使用的代码,我有一个JTextArea从几个套接字接收字符串,我必须在JTextArea中指出字符串的来源。例如,我要显示一个输出流和一个错误流。