我有一个“ConsoleFrame”,它应该将我的控制台输出实时显示到 JTextArea。
我重定向了输出流:
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
updateTextArea(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextArea(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
并调用 SwingUtilities.invokeAndWait 方法来附加新文本,效果很好
private void updateTextArea(final String text) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
txt_console.append(text);
}
});
} catch (InterruptedException ex) {
} catch (InvocationTargetException ex) {
}
}
但它在我的新 ConsoleFrame 中向我显示了这个错误:java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread 我得到了因为 EDT - 但它为什么工作以及如何调整我的代码以使其工作适当地?