현재 Log4J 로그를 JTextPane
으로 만들려고합니다. 기본 강조 표시 (예 : 오류가 빨간색이고 정보가 녹색)를 원하기 때문에 TextPane을 사용하고 싶습니다.JTextPane의 log4j
두 개의 로거가 설정되어 있고 (루트 로그 작성기) 한 파일에 모든 파일이 기록되고 다른 파일 (guiLogger
)은 GUI의 일부 오류 및 정보 만 JTextPane
에 기록합니다.
현재 내가 직면하고있는 문제는 TextPane에 추가 기능을 추가 할 수 없다는 것입니다. 그렇지 않습니다합니다 (append()
-method가 호출되는
# 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
하고 insertString()
-method 깨끗 수행
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 설정 파일은 다음과 같습니다 : 내가 현재 가지고하는 것은 다음과 같이 보입니다 catch
-block을 입력하십시오.)하지만 GUI의 텍스트 패널에 내용이 표시되지 않습니다.
- 가
JTextPane
에
- 방법에서
insertString()
-method을 실행SwingUtilities.invokeLater()
- 사용하여
insertString()
-method을 실행 :이 문제를 해결하기 위해 노력했다 무엇 - 세계
StyledDocument
- 개체를 사용하지 않고 직접 0에서 가져옵니다.-instance :log.getStyledDocument().insertString(0, "Hello World!", info_log);
- 의
setText()
- 메서드 (생성자에서만 작동 함).
validate()
,
revalidate()
및
repaint()
같은
SwingWorker
JTextPane
에는 fireContentChanged()
- 방법 (또는 이와 유사한)이 없기 때문에 여기에 분실되어 있습니다.
내가 더 조금 주위에 재생 및 다른 것들을 발견은 :
StyledDocument
가 업데이트 될 때
- (
getText()
를 호출은 텍스트가 삽입 된 것을 보여준다). StyledDocument
및JTextPane
을 초기화 한 후 컴파일러에서 직접append()
또는insertString()
-method를 호출하면 모두 정상적으로 작동합니다.System.out.println("Thread: "+Thread.currentThread().getName());
그것은 단순히 어딘가에 코드에서 두 로그 진술을 할 경우, 다음을 보여줍니다
또한, 나는 append()
-method 몸이를 추가하여 메소드를 호출하는 스레드 확인 :
Thread: AWT-EventQueue-0
Thread: AWT-EventQueue-0
및 I 호출시 append()
직접 Log
- 클래스 (플러스 위에서 두 로깅 문)의 생성자에서, 다음이 도시 -method :
Thread: AWT-EventQueue-0
Thread: AWT-EventQueue-0
Thread: AWT-EventQueue-0
첫 번째 호출은 아마 텍스트를 추가합니다. 그러나 다른 두 사람은 솔기가 작동하지 않습니다.
내 GUI는 을 사용하여 AWT-EventQueue
에서 빌드됩니다. 두 개의 로깅 호출은 동일한 컨텍스트에서 이루어 지므로 EventQueue에서도 발생합니다.
는 당신이'org.apache.log4j.lf5.LF5Appender'을 복제하지 않을 확신? –
@이 글은 내 목적에 조금 "과부하가 걸린 것 같아." –