Swing JEditorPaneAppender (Output im HTML-Format)

guni

Bekanntes Mitglied
Hallo,

versuche gerade einen JEditorAppener für log4j zu schreiben.

der JTextAppender ist ja recht einfach, da die logmessage als innerhalb der append-Methode des Appenders einfach in einen String umgewandelt werden kann ...
Java:
final String msg = layout.format(loggingEvent);
... den man dann mittels jTextPane.append(String) einfach in die Textpane schreibt.

Für eine JEditorPane scheint das Ganze eine Spur komplexer zu sein ...
die Read-Methode erwartet einen InputStream.
Und ein Doc.
Keine Ahnung, was ich da als Doc hernehmen kann ...
Keine Ahnung, wie ich die logmessage halbwegs performant in einen InputStream bringe ...
hab mir auch schon überlegt, den ConsoleAppender so zu extenden, dass ich den OutputStream an eine pipe übergebe ... aber Pipes sollte man ja eigentlich nur zwischen Threads hernehmen, oder?!

irgendwelche Vorschläge?!

mfg, guni
 
Guten Morgen.

habe nun im Netz einen TextAppender gefunden, den ich ein bisschen auf meine Bedürfnisse abgestimmt habe:

Java:
public class TextAreaAppender extends JScrollPane {
	private static final long serialVersionUID = 4307257775374222157L;
	private final JTextArea jTextArea = new JTextArea();
	
	private class LogWatcher extends AppenderSkeleton {

		private LogWatcher() {
//			layout = new PatternLayout("%m%n");
			layout = new SimpleLayout();
		}

		@Override
		protected void append(final LoggingEvent event) {
			new Thread(new Runnable() {
				public void run() {
					jTextArea.append(layout.format(event));
				}
			}).start();
		}

		@Override
		public void close() {
		}

		@Override
		public boolean requiresLayout() {
			return true;
		}
	}

	public TextAreaAppender() {
		Logger.getRootLogger().setLevel(Level.ALL);
		Logger.getRootLogger().addAppender(new LogWatcher());

		jTextArea.setEditable(false);
		jTextArea.setFont(new Font("Courier", Font.PLAIN, 12));
		DefaultCaret caret = (DefaultCaret) jTextArea.getCaret();
		caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

		setViewportView(jTextArea);
		setPreferredSize(new Dimension(640,480));
	}
}

Werde das Ganze noch ein bisschen ändern, da ich es designmäßig schrecklich finde, dass der Appender von einer Swing-Komponente erbt (aus meiner Sicht sollten Appender und TextWindow schon getrennt sein)

Wie auch immer ...

vielleicht kann sich unter dem obenstehenden Code wer was vorstellen.
Also: Ziel wäre, das Layout durch ein HTML-Layout zu ersetzen und in eine JEditorPane zu schreiben ... dann werden Fehler endlich farblich hervorgehoben !!!

hat jemand eine Idee, wie ich da beginnen könnte?!
 
so geht es auch nicht:

Java:
public class HTMLAppender extends AppenderSkeleton {
	private JEditorPane jEditorPane;
	
	public HTMLAppender(JEditorPane jEditorPane){
		super();
		this.layout = new HTMLLayout();
		this.jEditorPane = jEditorPane;
	}

	@Override
	protected void append(final LoggingEvent event) {
		final String msg = layout.format(event);
		new Thread(new Runnable() {
			public void run() {
				try {
					jEditorPane.read(new StringReader(msg), null);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}

	@Override
	public void close() {
	}

	@Override
	public boolean requiresLayout() {
		return true;
	}
}

der Grund is vermutlich, dass für jedes Logging event ein neuer Reader initialisiert wird!

HILFE!!!!!
 
Erstens weiss ich (und vermutlich andere auch nicht) so genau WAS du eigentlich willst.

Zweitens ist es hier so, dass am ehesten Anworten kommen, wenn du eigenen Code, der auch als solcher zu erkennen ist, postest und ganz konkret fragst warum etwas nicht geht oder warum diese oder jene Fehlermeldung auftritt.
 
@Andi:
Zweitens ist es hier so, dass am ehesten Anworten kommen, wenn du eigenen Code, der auch als solcher zu erkennen ist
Sämtlicher Code den du hier findest ist eigener Code.
Wie gesagt: beim TextAppender hab ich mir Quelltext zur Hilfe genommen, den ich irgendwo gefunden habe, der HTMLAppender ist völlig auf eigenem Mist gewachsen.

und ganz konkret fragst warum etwas nicht geht oder warum diese oder jene Fehlermeldung auftritt
Es tritt ja keine Fehlermeldung auf! Ich weiß nur nicht, wie ich das umsetzen soll.

Erstens weiss ich (und vermutlich andere auch nicht) so genau WAS du eigentlich willst.
OK ... also - ich versuchs nochmal zu erklären.
Apache hat eine Logging API (log4j).
In dieser API spielen 3 Komponenten zusammen:
1. Logger - für das eigentliche Logging
2. Layout - geben an, wie ein LogEvent formatiert werden soll
3. Appender - geben an, wo die LogEvents ausgegeben werden sollen (z.B. in der Console, in einer Datei, ...)

mein Ziel ist es nun, einen Appender zu schreiben, der Logmeldungen in einem SWING-Fenster ausgibt.
Unter Einsatz einer JTextArea ist mir das bereits gelungen (-> Code): sämtliche Logevents, die während dem Ablauf des Programmes auftreten, werden in diesem Fenster mitgeschrieben.

nun gibt es unter log4j allerdings auch ein HTML-Layout.
und unter SWING gibt es eine JEditorPane, die einen HTMLEditorKit nutzen kann.

nun will ich meinen Appender (HTMLAppender) so schreiben, dass JEDES LOGEVENT (möglichst performant) in die JEditorPane dazugeschrieben wird.

Meine Frage an die Community ist also: WIE KANN ICH DEN CONTENT DER JEDITORPANE UM EINEN STRING ERWEITERN?!

mfg, guni
 
Java:
String newText = editorpane.getText()+"HIER IST EINE NEUE ZEILE";
editorpane.setText(newText);


So kannst du einen String anhängen
 
Zuletzt bearbeitet:
Java:
JEditorPane htmlDisplay = new JEditorPane;
htmlDisplay.setContentType("text/html");
Ist es das, was du suchst?
 

Neue Themen


Zurück
Oben