package org.fanhongtao.log; import java.awt.Color; import java.io.StringWriter; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import org.apache.log4j.Level; import org.apache.log4j.WriterAppender; import org.apache.log4j.spi.LoggingEvent; /** * This appender write log messages into a JTextPane controller.<br> * If the log level is equal to ERROR, or bigger than ERROR, the message is * written in <b>red</b> color. * * @author Fan Hongtao * @created 2010-11-10 */ public class JTextPaneAppender extends WriterAppender { private static SimpleAttributeSet red = new SimpleAttributeSet(); private JTextPane textPane; private StringWriter sw; static { StyleConstants.setForeground(red, Color.red); } public JTextPaneAppender(JTextPane textPane) { this.textPane = textPane; sw = new StringWriter(1024); setWriter(sw); } @Override public void append(LoggingEvent event) { sw.getBuffer().setLength(0); super.append(event); final String message = sw.toString(); final int logLevel = event.getLevel().toInt(); final StyledDocument doc = textPane.getStyledDocument(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { if (logLevel >= Level.ERROR_INT) { doc.insertString(doc.getLength(), message, red); } else { doc.insertString(doc.getLength(), message, null); } } catch (BadLocationException e) { // e.printStackTrace(); } } }); } }