java jtextarea 显示_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作为最简单,清晰且没有任何副作用,效果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值