需要:将Java应用程序的日志输出到GUI组件,例如JTextArea。
关注:需要以静态方式记录来自任何类的内容。但是,GUI记录器组件不能是静态的(显然),因为它是父组件的成员。
我该怎么办?
答案 0 :(得分:2)
创建一个singelton日志提供程序并将“textfield”添加为它的侦听器。
logger singelton的例子:
interface Listener {
void log(String log);
}
enum Logger {
instance;
private List<Listener> listeners = new LinkedList<Listener>();
public void addListener(Listener l) {
synchronized(listeners) {
listeners.add(l);
}
}
public void log(String log) {
synchronized(listeners) {
for(Listener l : listeners)
l.log(log);
}
}
}
添加你的监听器(你需要自己实现),如下所示:
Logger.instance.addListener(myTextField);
并使用它(来自任何类):
Logger.instance.log("Hello World!");
或者你可以使用像log4j这样的包。
答案 1 :(得分:2)
记录到文件,让组件跟随文件的尾部。如果要将输出放入网格中,可能需要使用log4j的XML日志记录。
更新:您也可以实现内存中的圆形记录器。
答案 2 :(得分:1)
数据绑定在我脑海中浮现。您需要一个代表您的日志的模型,并且此模型绑定到GUI组件。 SWT的常见数据绑定框架是JFace数据绑定,我确信SWING存在类似的东西。
如何工作 - 记录器将消息添加到模型中,可能只是一个字符串的Arraylist(logentries)。数据绑定类在每次模型更改时都会侦听模型并更新GUI。它也可以反过来工作(GUI上的编辑可以发送到模型)但你只需要一个方向。
答案 3 :(得分:1)
注意您的课程和套餐之间的循环依赖关系,您不需要意大利面条代码。
My Swing应用程序存在9个模块(控制器,应用程序,平台,工具,模型,持久性,服务,记录器和视图)
以下是依赖项:
view -> logger, controller, utils, model
controller -> logger, application, model, utils
application -> service, model, utils, platform
service -> persistence, model, utils
platform -> model
utils -> no dependencies
model -> no dependencies
logger -> model, utils
所需的依赖关系是从视图到控制器,但不是从控制器到视图。
所以最好是添加一个模块记录器并创建一个处理程序(这是一个可观察的),它通知观察者(像JFrame,JFace =观察者这样的视图)。
查看和服务(您想要触发观察者的位置)模块不是相互依赖,而是通过记录器模块。
但我认为数据仓也是如此。我想除了你是依赖于框架的。我的解决方案不是,所以如果我想从Swing切换到swt,不用担心,我只是为swt实现它,我的业务逻辑保持不变。
你们都应该认为更多的设计明智。 (并使用maven。)