重定向System.out和System.err到JTextPane,分别用黑色红色显示(改进)

在上一篇 重定向System.out和System.err到JTextPane,分别用黑色红色显示 中讲了如何把 System.out 和 System.err 重定向到 JTextPane 上,并分不同颜色显示,其中用到了 PipedInputStream、PipedOutputStream。那个例子还是参考的 《The Java Developers Almanac 1.4》,翻译出来叫做 《Java 开发者年鉴 1.4》,显得多么的权威啊,我当时还真把它看成官方最佳推荐实现了,太迷信了。

可是现在看来,前面那个实现不仅代码繁琐,而且是 Bug 多多。现在重新对上回的 ConsolePane 来个新的更简洁高效的实现。代码如下:

使用方法依旧,是一个 JScrollPane,加上自己的面板上就行:
getContentPane().add(ConsolePane.getInstance(), BorderLayout.CENTER);

界面效果图同前面基本一样:

RedirectSystemOutLog.jpg

能解决的问题恰恰就是上面遗留下来的1、2、3:
1. 不再产生 java.io.IOException: Write end dead 异常
2. 输出时不再会缺几个字母,或产生空行了
3. 输出顺序根据程序执行先后能得到保证

如果希望能捕获到 Log4j 的输出,仍然依赖于要用 Log4j 1.2.13 或以上的版本,并设置属性:

log4j.appender.console.follow = true

这个问题在上一篇 重定向System.out和System.err到JTextPane,分别用黑色红色显示 Log4J 与 ConsolePane 一节中用讲,但是如果是用 SWT 的话,这个问题可以解决,不再依赖于这一属性设置了。

这段时间正在研究 SWT,感觉用起来比 SWING 舒服多了,考虑暂时放耽下 SWING 了,过阵会再写一篇关于把 System.out 和  System.err 定向到 SWT 文本控件的日志。

TestConsolePane 代码还是请见上篇日志:重定向System.out和System.err到JTextPane,分别用黑色红色显示

本文链接 https://yanbin.blog/system-out-system-err-to-jtextpane-improved/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

1 Comment
Inline Feedbacks
View all comments
thebye85
thebye85
17 years ago

不错,学习了~