J.O*_*sen 4 java user-interface swing multithreading jtextarea
客户端有gui和额外的线程(处理套接字输入并将其打印出来以传递PrintStream类型的对象).gui形式有new javax.swing.JTextArea().我需要传递给PrintStream要写入的对象的线程:ClientThreadIn(PrintStream inOutput){...}.如何创建/绑定GUI的JTextArea接受数据的形式ClientThreadIn使用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
Run Code Online (Sandbox Code Playgroud)
所以JTextArea应该类似于控制台.它应该能够接受来自Thread的数据(实际上Thread写入gui的PrintStream)...是否有类似于JTextArea.getInputStream()的东西?
Hov*_*els 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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将它包装在PrintStream对象中并让套接字使用它是微不足道的.
| 归档时间: |
|
| 查看次数: |
4836 次 |
| 最近记录: |