有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何绑定swing。JTextArea到PrintStream以接受数据

客户端有gui和额外的线程(用于处理socket输入并将其打印到PrintStream类型的Pass对象)。gui表单有new 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()


共 (1) 个答案

  1. # 1 楼答案

    一种方法是创建一个类,将JTextArea链接到OutputStream,比如称为TextAreaOutputStream的OutputStream,并让它扩展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对象中并让套接字使用它是很简单的