[英]JTextArea in other JFrame display realtime console output
我有一个“ 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而得到该错误-但是它为什么起作用以及如何修改我的代码使其起作用好吗
必须从EDT中调用invokeAndWait
,否则会导致异常,
请谨慎地使用invokeAndWait
,因为它可以冻结整个Swing GUI,并被RepaintManager
的异常锁定(并非在所有情况下都只创建GUI,重新布局,刷新某些方法),然后需要重新启动应用程序,
需要invokeAndWait
测试if (EventQueue.isDispatchThread()) {
/ if (SwingUtilities.isEventDispatchThread()) {
为true,则可以设置setText("")
/ append(""
),而不会产生任何副作用,美国东部时间(EDT),但有关将良好的实践包装到invokeLater
使用SwingWorker
,有实现的方法process
, publish
, setProcess
和done
, EDT by default
所有提到的方法都会通知EDT by default
,
SwingWorker
被指定为仅运行一次,以便重复(在一段时间内)将Executor
用于SwingWorker
或Runnable#Thread
是最简单,清晰且没有任何副作用,影响的
您可以从任何线程使用SwingUtilities.invokeLater()
,并且对于错误流,即使您已经在EDT中,也可能最好使用它:
private void updateTextArea(final String text) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
txt_console.append(text);
}
});
}
您遇到的特定错误来自EDT外部,然后可能调用invokeAndWait()
以便将输出输出到控制台。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.