java – JTextArea在其他JFrame中显示实时控制台输出
作者:互联网
我有一个“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:无法从事件调度程序线程调用invokeAndWait
而且我因为EDT而得到了 – 但为什么它可以工作?如何调整我的代码以使其正常工作?
解决方法:
> invokeAndWait必须在EDT之外调用,否则会导致a.m.异常,
>小心使用invokeAndWait,因为可以冻结整个Swing GUI,由RepaintManager的异常锁定(并非在所有情况下只创建GUI,重新启动,刷新一些方法),然后应用程序需要重启,
> for invokeAndWait需要测试if(EventQueue.isDispatchThread()){/ if(SwingUtilities.isEventDispatchThread()){on true你可以setText(“”)/ append(“”)没有任何副作用,输出完成在EDT上,但是关于在invokeLater中包装的好实践
>使用SwingWorker,实现方法process,publish,setProcess和done,所有提到的方法默认通知EDT,
> SwingWorker被指定只运行一次,重复(在某个时期)使用Executor for SwingWorker或Runnable #Thread作为最简单,清晰且没有任何副作用,效果
标签:java,swing,scheduled-tasks,jtextarea,swingutilities 来源: https://codeday.me/bug/20190703/1368923.html