需要:將Java應用程序的日誌輸出到GUI組件(例如JTextArea)中。Java日誌==> JTextArea
關注:需要以靜態方式從任何類別記錄事物。但是,GUI記錄器組件不能是靜態的(顯然),因爲它是父組件的成員。
我該怎麼辦?
需要:將Java應用程序的日誌輸出到GUI組件(例如JTextArea)中。Java日誌==> JTextArea
關注:需要以靜態方式從任何類別記錄事物。但是,GUI記錄器組件不能是靜態的(顯然),因爲它是父組件的成員。
我該怎麼辦?
創建一個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這樣的軟件包。
數據綁定出現在我的腦海。您需要一個代表您的日誌的模型,並且此模型綁定到GUI組件。 SWT的常見數據綁定框架是JFace Databinding,我確定SWING有類似的地方。
它將如何工作 - 記錄器將消息添加到模型,可能只是字符串(logentries)的Arraylist。數據綁定類監聽模型,並在模型每次更改時更新GUI。它也可以反過來(GUI上的編輯可以發送給模型),但你只需要一個方向。
登錄到文件,讓組件跟隨文件的尾部。如果要將輸出放入網格中,您可能需要使用log4j的XML日誌記錄。
更新:你也可以實現一個內存循環記錄器。
好的調用 - 這解耦了時間/優先級要求。記錄應該是高優先級的,顯示日誌不應該。 – 2010-06-02 14:34:54
小心你的類和包之間的循環依賴關係,你不需要意大利式麪條代碼。
我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。)
不要寫另一個日誌框架,只是不要這樣做。使用log4j(或slf4j,它似乎是所有的憤怒) – Justin 2010-06-02 14:29:47
我不同意,不要添加另一個依賴項,如果你想做一些簡單的事情.. – dacwe 2010-11-13 23:03:46