在 GUI 面板内创建 Java 控制台
如何在 GUI 面板内创建 Java 控制台实例?
How can I create an instance of the Java console inside of a GUI panel?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何在 GUI 面板内创建 Java 控制台实例?
How can I create an instance of the Java console inside of a GUI panel?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
这是一个正在运行的类。 您可以将其实例安装到系统中并使用以下方法进行错误:
更新于 2014-02-19:使用 EventQueue.invokeLater() 来避免 GUI 线程问题,这些问题在原始版本中很少会出现。
2014-02-27 更新:更好的实施
2014-03-25 更新:正确记录和修改 在
run()
方法中删除文本区域中的行,以避免追加和删除之间的竞争条件,如果控制台充满输出,则可能会发生这种情况。 最终结果对我来说似乎也更干净。2022-11-07更新:进一步完善实施,彻底消除产出泛滥问题。 请注意,当输出过多时,此版本将彻底抑制输出(带有一行注释)。 以前的版本最终会开始 GC 抖动,并且虚拟机响应会很大程度上冻结(实际上不会崩溃),直到它最终设法赶上。
这是它的实际截图:
Here's a functioning class. You can install an instance of this into the system out and err using:
Updated 2014-02-19: To use EventQueue.invokeLater() to avoid GUI threading issues which can crop up very rarely with the original.
Updated 2014-02-27: Better implementation
Updated 2014-03-25: Correct recording & deletion of lines in text area to be within the
run()
method to avoid race-condition between appending and deleting which can happen if the console is flooded with output. The end result seems cleaner to me, as well.Updated 2022-11-07: Further improve implementation to completely eliminate problems from flooding with output. Note that this version will outright suppress output (with a one-line note) when it is overwhelmed with output. Previous version would eventually begin GC thrashing and the VM response would largely freeze (without actually crashing) until it finally managed to catch up.
And here's a screenshot of it in action:
@软件猴子:
有效! :)
@Sofware Monkey:
It works! :)
我知道这是一个旧线程,但事实上,我在尝试找出一种好方法时发现了它,这意味着其他人也可能会这样做。
这是一种(可能)更干净的方法来完成软件猴子发布的内容:
I know that this is an old thread but the fact that I found it while trying to figure out a good way of doing this means others probably will too.
Here's a (Probably) cleaner way of doing what software monkey posted:
ByteArrayOutputStream 可用于省略缓冲内容。
您可以绑定 ByteArrayOutputStream#reset() 到某个按钮。
ByteArrayOutputStream can be used to omit buffering stuff.
Rather than limiting line number, you can bind ByteArrayOutputStream#reset() to some button.
我最近使用优秀代码提供的劳伦斯·多尔在我的一个项目中。
然而,就我而言,代码消耗了太多内存。 我通过用
JLabel
替换JTextarea
成功地大幅减少了内存消耗。我的内存节省搜索表明,
JTextarea
内部代码往往会占用太多时间发送的实际文本。 因此,所有这些文本都无法被垃圾收集。这是初始代码的灵活版本(用锁代替线程同步)。
JComponentOutputStream.java
使用示例
I recently use the excellent code provided by Lawrence Dol in one of my project.
However, in my case the code consumed too many memory. I managed to reduce drastically the memory comsuption by replacing
JTextarea
by aJLabel
.My memory saving searches showed that
JTextarea
internal code tends to hold the actual text sent too much time. Consequently, all this text could not be garbage collected.Here is the flexible version of initial code (with thread synchronization replaced by locks).
JComponentOutputStream.java
Sample usage