我正在设计一个程序,其中JEditorPane
用户可以输入和编译Java代码。然后,他们可以在新流程中运行他们的程序,然后他们的输出将显示在JTextArea
中。我通过扩展JTextArea
并将其添加为成员来实现此目的:
private OutputStream writer = new OutputStream() {
public void write(int b) {
Console.this.append(String.valueOf((char) b));
}
};
然后我有一个简单的getStream()
方法,返回OutputStream
包裹的PrintWriter
,并使用{{1}调用System.setOut()
和System.setErr()
}。
现在问题出现了:如果用户编译了一个程序,其中大量输出一次发送到控制台(例如,PrintWriter
调用的无限循环),整个GUI就会挂起。我尝试使用System.out.println()
处理SwingWorker
来电来解决此问题,但似乎没有任何效果。
即使有大量文本写入append()
,有没有办法让GUI保持响应?我假设问题的一部分是JTextArea
调用后更新GUI所花费的时间。有没有办法延迟写入append()
一小部分,以便用户可以点击按钮终止该过程?
答案 0 :(得分:4)
我想知道你的问题是否是你在OutputStream中写的方式。也许您应该写入EDT的StringBuilder对象 off ,然后当出现“\ n”时,将EDT上的String追加到JTextArea。
这样的事情:
// this is all called in a background thread
public void write(int b) throws IOException {
if (b == '\r')
return;
if (b == '\n') {
final String text = sb.toString() + "\n";
SwingUtilities.invokeLater(new Runnable() {
// except this is queued onto the event thread.
public void run() {
textArea.append(text);
}
});
sb.setLength(0);
return;
}
sb.append((char) b);
}