登录javagui

登录javagui,java,swing,logging,user-interface,jtextarea,Java,Swing,Logging,User Interface,Jtextarea,我正在开发一个带有JTextArea的GUI来显示某些消息。此处可能会出现两种消息:一种是专门为用户编写的消息(“任务已完成”、“未找到文件”、“请稍候”);另一种是为开发人员编写的消息(有关异常、警告、帮助消息的信息……) 到目前为止,我正在考虑两个选项来显示JTextArea上的信息:使用setText()方法,或者使用System.out.print()并将输出流重定向到JTextArea 哪种选择更好?为什么? 如何实现允许用户选择哪种类型的系统 将在JTextArea上显示的消息

我正在开发一个带有
JTextArea
的GUI来显示某些消息。此处可能会出现两种消息:一种是专门为用户编写的消息(“任务已完成”、“未找到文件”、“请稍候”);另一种是为开发人员编写的消息(有关异常、警告、帮助消息的信息……)

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

  • 如何实现允许用户选择哪种类型的系统
    将在
    JTextArea
    上显示的消息数量?类似于带有不同选项的
    JComboBox
    ,因此用户可以选择是只获取应用程序消息还是与工作流相关的消息(警告、异常等)
  • 我只需要使用
    setText()
    。使用
    System.out.println()
    并重定向到
    JTextArea
    将使事情变得更加复杂
  • 如果您有一个收集消息的组件(然后由
    JTextArea
    显示),您可以对其进行更改,这样您不仅可以提供消息,还可以提供类似于
    类别的内容。根据
    JComboBox
    的内容,只有特定
    类别的消息才会显示在
    JTextArea
  • 如果我可以建议一种稍微不同的方法:也许您正在应用程序中使用类似Log4J或Logback的东西来记录消息。它很可能能够为您的日志框架注册一个自定义appender,重定向到
    JTextArea
    。这种方法可能需要更多的工作才能让它运行起来,但它可以允许更大的灵活性,而不是重新发明一个已经存在的轮子

    关于如何做到这一点,我的两分钱将是有一个类似于
    反馈管理器的东西(我刚刚编了一个名字,所以请随意编一个更好的名字)。这个
    FeedbackManager
    将是一个单例,所有使用它的类都将引用同一个实例。每当您需要向用户呈现消息时,将其发布到
    反馈管理器
    ,包括
    类别
    (见上文)。当
    FeedbackManager
    收到
    消息时,它应通知所有侦听器已发布新消息

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

  • 我只需要使用
    setText()
    。使用
    System.out.println()
    并重定向到
    JTextArea
    将使事情变得更加复杂
  • 如果您有一个收集消息的组件(然后由
    JTextArea
    显示),您可以对其进行更改,这样您不仅可以提供消息,还可以提供类似于
    类别的内容。根据
    JComboBox
    的内容,只有特定
    类别的消息才会显示在
    JTextArea
  • 如果我可以建议一种稍微不同的方法:也许您正在应用程序中使用类似Log4J或Logback的东西来记录消息。它很可能能够为您的日志框架注册一个自定义appender,重定向到
    JTextArea
    。这种方法可能需要更多的工作才能让它运行起来,但它可以允许更大的灵活性,而不是重新发明一个已经存在的轮子

    关于如何做到这一点,我的两分钱将是有一个类似于
    反馈管理器的东西(我刚刚编了一个名字,所以请随意编一个更好的名字)。这个
    FeedbackManager
    将是一个单例,所有使用它的类都将引用同一个实例。每当您需要向用户呈现消息时,将其发布到
    反馈管理器
    ,包括
    类别
    (见上文)。当
    FeedbackManager
    收到
    消息时,它应通知所有侦听器已发布新消息


    实例化
    JTextArea
    时,向
    反馈管理器注册一个匿名侦听器
    ;调用侦听器时,它可以检查是否必须根据选择的
    JComboBox
    来显示消息,如果是,如果不想使用额外的日志库(如果程序很小,或者如果必须节省空间(例如在小程序中)),则将其附加到
    JTextArea
    ,您始终可以在JSE:java.util.logging中使用日志记录。 如果是这样,您可以使用处理程序写入文本组件:

    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);
    

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

    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);
    

    您是否考虑过使用日志库?像log4j或logback这样的库允许您编写一个定制的appender来登录到JTextArea。日志记录级别的控制也是日志库的基本特征。由于它与日志有关,请考虑<代码>附录()/代码>过<代码> SETTY()/<代码>,<代码> SETTEST()>代码>将简单地>代码>替换/重写< /代码>组件关注的前一个值,而前者将添加<>代码<>代码>到前一个值。您可以尝试这种行为,只需在“检查我的日志”解决方案中提到的工作代码中使用
    setText()
    更改
    append()
    :您考虑过使用日志库吗?像log4j或logback这样的库将允许y