我正在嘗試使Log4J登錄到JTextPane
。我想使用TextPane,因爲我想要基本突出顯示(例如,錯誤是紅色的,信息是綠色的)。JTextPane中的log4j
我有兩個記錄器設置,一個(根記錄器)將所有記錄到一個文件中,另一個(guiLogger
)僅在JTextPane
的GUI上記錄一些錯誤和信息。
我目前面臨的問題是,我無法追加到TextPane上工作。我現在有看起來像這樣:
public class Log extends AppenderSkeleton{
private final JTextPane log;
private final StyledDocument doc;
public Log(){
super();
log = new JTextPane();
doc = log.getStyledDocument();
}
@Override
protected void append(LoggingEvent loggingEvent) {
try {
doc.insertString(doc.getLength(), "Hello World!", null);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
public JTextPane getView(){
return log;
}
}
log4j的配置文件看起來是這樣的:
# The root-logger should log everything.
log4j.rootLogger = DEBUG, file
# Append the logs to a file.
log4j.appender.file = org.apache.log4j.RollingFileAppender
# [...]
# The logger which logs on the GUI (just some user-information).
log4j.logger.guiLogger = INFO, gui
# Append the logs to the GUI
log4j.appender.gui = mypackage.Log
# Formatting of the output:
log4j.appender.gui.layout = org.apache.log4j.PatternLayout
log4j.appender.gui.layout.ConversionPattern = %m%n
的append()
- 方法被調用,而insertString()
- 方法進行清潔(它不輸入catch
-block),但我在GUI上看不到TextPane中的任何內容。
我試圖解決這個問題:
- 執行使用
SwingUtilities.invokeLater()
- 的
insertString()
- 方法從上JTextPane
一個
- 方法,如
validate()
,revalidate()
和repaint()
執行insertString()
- 方法 - 不使用全球
StyledDocument
- 對象,但直接從log
-instance:log.getStyledDocument().insertString(0, "Hello World!", info_log);
setText()
-JTextPane
的方法(僅適用於構造函數)。
SwingWorker
由於JTextPane
沒有fireContentChanged()
- 方法(或類似),我有點失去了在這裏。
我身邊多一點玩,發現了一些其他的東西:
- 的
StyledDocument
被更新(調用getText()
表明文本已插入)。 - 當我直接從編譯器調用
append()
或insertString()
-方法(在初始化StyledDocument
和JTextPane
後),它一切正常。
另外,我檢查哪個線程調用該方法通過將此到append()
- 方法體:
System.out.println("Thread: "+Thread.currentThread().getName());
它表明,如果我只是做兩個日誌語句從代碼某處以下內容:
Thread: AWT-EventQueue-0
Thread: AWT-EventQueue-0
,當我調用append()
-method直接從Log
-class(加上從上述兩個測井語句)的構造,它示出了以下內容:
Thread: AWT-EventQueue-0
Thread: AWT-EventQueue-0
Thread: AWT-EventQueue-0
第一次調用可能附加文本。但另外兩個人不縫合工作。
我的GUI是通過使用SwingUtilities.invokeLater()
從AWT-EventQueue
建立的。這兩個日誌記錄調用是在相同的上下文中進行的(因此也來自EventQueue)。
你確定你不是複製'org.apache.log4j.lf5.LF5Appender'? – 2011-12-17 18:58:44
@ʘleg這個看起來有點「超載」爲我的目的。 – 2011-12-17 19:45:43