登录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
内
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