【发布时间】:2012-02-13 20:38:57
【问题描述】:
我正在使用 JTextArea 开发“控制台”,一切都很好,除了我的输出不像我想要的那样工作。
我正在使用我在 Stackoverflow 上找到的一个类的修改版本。
import java.io.*;
import javax.swing.*;
public class textareaStream extends OutputStream {
//*************************
//* Parameters
//*************************
private JTextArea textArea; // target text area
private byte[] aByte; // array for write(int val);
//*************************
//* Constructor
//*************************
public textareaStream(JTextArea ta) {
textArea=ta;
aByte=new byte[1];
}
//*************************
//* Writing methods
//*************************
public void write(int val) {
aByte[0]=(byte)val;
write(aByte,0,1);
}
public void write(byte[] ba) {
write(ba,0,ba.length);
}
public synchronized void write(byte[] ba,int str,int len) {
try {
for(int xa=0; xa<10; xa++) {
try {
textArea.append(new String(ba,str,len));
break;
} catch(Throwable thr) {
if (xa==9) {
thr.printStackTrace();
} else {
Thread.sleep(200);
}
}
}
} catch(Throwable thr) {
CharArrayWriter caw=new CharArrayWriter();
thr.printStackTrace(new PrintWriter(caw,true));
textArea.append(System.getProperty("line.separator","\n"));
textArea.append(caw.toString());
}
}
}
这很好用,除非从事件处理程序调用“write”方法。
在事件处理程序中,直到事件完成运行,文本才会写入文本区域。我想要的是在命令运行时将文本写入控制台(这对于耗时的命令尤其需要)。换句话说,当用户按下回车键时(例如),在将数据打印到 JTextArea 时会运行一个很长的进程,但直到整个进程运行完 后才会显示文本。
有人对我如何解决这个问题有任何想法吗?
【问题讨论】:
标签: swing events event-handling buffer