客户端有 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/