2010-06-02 75 views
5

需要:將Java應用程序的日誌輸出到GUI組件(例如JTextArea)中。Java日誌==> JTextArea

關注:需要以靜態方式從任何類別記錄事物。但是,GUI記錄器組件不能是靜態的(顯然),因爲它是父組件的成員。

我該怎麼辦?

回答

2

創建一個singelton日誌提供程序並添加「textfield」作爲偵聽器。記錄儀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這樣的軟件包。

+3

不要寫另一個日誌框架,只是不要這樣做。使用log4j(或slf4j,它似乎是所有的憤怒) – Justin 2010-06-02 14:29:47

+2

我不同意,不要添加另一個依賴項,如果你想做一些簡單的事情.. – dacwe 2010-11-13 23:03:46

1

數據綁定出現在我的腦海。您需要一個代表您的日誌的模型,並且此模型綁定到GUI組件。 SWT的常見數據綁定框架是JFace Databinding,我確定SWING有類似的地方。

它將如何工作 - 記錄器將消息添加到模型,可能只是字符串(logentries)的Arraylist。數據綁定類監聽模型,並在模型每次更改時更新GUI。它也可以反過來(GUI上的編輯可以發送給模型),但你只需要一個方向。

2

登錄到文件,讓組件跟隨文件的尾部。如果要將輸出放入網格中,您可能需要使用log4j的XML日誌記錄。

更新:你也可以實現一個內存循環記錄器。

+0

好的調用 - 這解耦了時間/優先級要求。記錄應該是高優先級的,顯示日誌不應該。 – 2010-06-02 14:34:54

1

小心你的類和包之間的循環依賴關係,你不需要意大利式麪條代碼。

我Swing應用程序存在出9個模塊(控制器,應用,平臺,utils的,型號,持久性,服務,記錄器,和視圖)

這裏有依賴關係:

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