Java Log ==> JTextArea中

时间:2010-06-02 13:07:15

标签: java logging jtextarea

需要:将Java应用程序的日志输出到GUI组件,例如JTextArea。

关注:需要以静态方式记录来自任何类的内容。但是,GUI记录器组件不能是静态的(显然),因为它是父组件的成员。

我该怎么办?

4 个答案:

答案 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。)