java - 如何绑定(bind)swing.JTextArea到PrintStream接受数据

标签 java multithreading swing user-interface jtextarea

客户端有 gui 和额外的线程(处理套接字输入并将其打印出来以传递 PrintStream 类型的对象)。 gui 表单有 new javax.swing.JTextArea()。我需要将对象 PrintStream 传递给线程以写入:ClientThreadIn(PrintStream inOutput){...}。如何使用 PrintStream 创建/绑定(bind) 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应该类似于console。它应该能够接受来自 Thread 的数据(实际上是 Thread 写入 gui 的 PrintStream)... 有没有类似JTextArea.getInputStream()的东西?

最佳答案

一种方法是创建一个将 JTextArea 链接到 OutputStream 的类,比如称为 TextAreaOutputStream,并让它扩展 OutputStream。给它一个 StringBuilder 对象来保存它在 write(int b) 覆盖中构造的字符串,并给它一个对要写入文本的 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 对象中并让您的套接字使用它是微不足道的。

关于java - 如何绑定(bind)swing.JTextArea到PrintStream接受数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10872951/

相关文章:

java - 添加maven依赖后,org.apache.catalina.filters.CSRF_NONCE错误信息

java - wav 文件打开后无法删除,java

java - JLabel 文本未出现

performance - 是否对现代CPU缓存进行了优化以应对不断发展的步伐?跨线程?

Java图像图标数组

java - 添加选项卡替换选项卡 (Java)

java - Java 中将多个字符串分组为一个通用字符串

java - IntelliJ "result of inputstream.read is ignored"- 如何修复?

java - 检测 Bytebuffer 是否包含 int 或仅包含 byte[]

java - 从线程的内部线程启动 android Activity 。