3

如何在程序运行时创建显示 System.out/err 的 Swing 控制台窗口?

我有一个使用大量 System.out 状态更新的应用程序,我想将其从 Eclipse 迁移到独立的 .jar 中。我一直在尝试创建一个“控制台窗口”,它将显示 System.out 和 System.err。我使用链接作为起点,虽然它与程序启动的 GUI 应用程序一起工作正常,但只要我启动运行应用程序核心的线程,控制台窗口就会停止更新。我测试了将 system.out 重定向到一个文件并且效果很好,所以我对我可能做错了什么感到困惑。本质上,我有该计划的几个主要阶段。

  1. 程序启动。控制台初始化正常,直到我调用线程。
  2. 图形用户界面初始化。相同的。
  3. 初始逻辑运行。相同的。
  4. 在一切似乎都停止工作的线程中: JTextArea 从未实际加载 - 窗口已创建,但内容只是当时窗口后面的任何内容的副本,并且没有写入任何文本
4

3 回答 3

3

我认为您可能正在尝试从事件调度线程以外的线程更新文本区域,这通常会导致 GUI 无法更新/挂起/其他坏事发生。

您要做的是通过调用SwingUtilities.invokeLater( link ) 来更新您的显示。像这样的东西:

SwingUtilities.invokeLater(new Runnable(){
  public void run(){
    myTextArea.append( "Some string" );
  }
});

而不是使用System.out并且System.err您是否考虑过使用真正的日志记录系统?System.out应用程序通常不使用它来记录消息,因为它是一种全有或全无的方法。使用任何一半体面的日志库,您都可以设置级别并微调您接收消息的位置。我个人喜欢 Logback + SLF4J,但是 Java 中内置的日志系统对于一个简单的库来说已经足够了。

于 2013-06-19T15:51:43.377 回答
2

您可以尝试使用消息控制台

我在使用消息控制台时使用了 PipedStreams,发现它们很难使用,因此我使用了不同的方法。

于 2013-06-19T15:54:17.660 回答
1

通常,您应该避免手动记录 System.Out 内容,因为它会变得非常麻烦,并实现诸如log4j之类的日志记录库。这篇文章有更多关于日志库的信息。

于 2013-06-19T15:56:15.717 回答