2

我正在开发一个带有 a 的 GUIJTextArea来显示某些消息。这里可能会出现两种消息:那些是故意写给用户的(“任务已完成”“未找到文件”“请稍候” ……)和那些给开发者的消息(关于异常、警告、帮助的信息消息...)。

  • 到目前为止,我正在考虑两种显示信息的选项JTextArea:使用setText()方法,或者使用System.out.print()输出流并将其重定向到JTextArea.

哪个选项更好?为什么?

  • 如何实现一个系统以允许用户选择
    要在 上显示哪种消息JTextArea?类似于JComboBox具有不同选项的东西,因此用户可以选择他/她是否只想获取应用程序消息或与工作流相关的消息(警告、异常等)
4

2 回答 2

4
  1. 我只会使用setText(). 使用System.out.println()并重定向到JTextArea会使事情变得不必要地复杂。
  2. 如果您有一个收集消息的组件(然后由 显示JTextArea),您可以更改它,以便您不仅提供消息,还提供类似Category. 根据 的内容JComboBox,只有特定的消息Category会显示在 中JTextArea

如果我可以建议一种不同的方法:也许您在应用程序中使用 Log4J 或 Logback 之类的东西来记录消息。它很可能能够为您的日志记录框架注册一个自定义附加程序,该附加程序重定向到JTextArea. 这种方法可能需要做更多的工作才能让它运行起来,但它可以提供更大的灵活性——而不是重新发明已经存在的轮子。

关于如何做到这一点,我的两分钱就是拥有类似 a 的东西FeedbackManager(我只是编了一个名字,所以请随意编一个更好的名字)。这FeedbackManager将是一个单例,所有使用它的类都将引用同一个实例。每当您需要向用户显示消息时,请将其发布到FeedbackManager,包括Category(见上文)。当FeedbackManager接收到 aMessage时,它应该通知它的所有听众有一条新消息已发布。

实例化 时JTextArea,向 ; 注册一个匿名侦听器FeedbackManager。当监听器被调用时,它可以根据 的选择检查消息是否必须显示JComboBox,如果是,则将其附加到JTextArea.

于 2013-07-24T07:58:40.793 回答
4

如果您不想使用额外的日志库(如果程序很小,或者您必须节省空间(例如在小程序中)...),您可以随时使用 JSE 中的日志记录:java.util .记录。如果是这样,您可以使用 Handler 写入文本组件:

final class TextComponentHandler extends Handler {
  @Nonnull private final JTextArea text;
    TextComponentHandler(@Nonnull JTextArea text) {
      this.text = text;
    }
  @Override
  public void publish(LogRecord record) {
    if (isLoggable(record))
      synchronized(text) {
        text.append(getFormatter().format(record));
      }
  }
  @Override
  public void flush() {/**/}
  @Override
  public void close() throws SecurityException {/**/}
}

并添加:

JTextArea textArea = new JTextArea() {
  @Override
  public void addNotify() {
    super.addNotify();
    for(Handler hh : logger.getHandlers())
      if (hh == h)
        return;
    logger.addHandler(h);
  }
  @Override
  public void removeNotify() {
    super.removeNotify();
    logger.removeHandler(h);
  }
};
Logger logger = Logger.getLogger("my.logger");
Handler h = new TextComponentHandler(textArea);
logger.addHandler(h);
于 2013-07-24T17:56:18.137 回答