JTextPane zu langsam beim neuzeichnen

spinatnudel

Grünschnabel
Moin,Moin!
Ich bin dabei eine Oberfläche für einen HTMLChat zu schreiben. Das ganze funktioniert auch soweit, bis auf ein Problem:

Die Darstellung des Textes geschieht mit der Class unten. Mit "addText(String string)" füge ich dem Textpanel HTML-Text hinzu. Dort sind FONT,A und IMG-Tags drin.
Funktioniert auch soweit. Nur wenn ich das 1-1.5 Stunden laufen lasse, kommt er mit dem Neuzeichnen nicht hinterher, bzw. bekomme auch irgendwann Fehlermeldungen die ich nicht deuten kann. Ich habe leider auch das Problem, das ich das HTMLDocument nicht wirklich verstehe. Ich hatte gehofft, das es was bringt, wenn ich die max. Größe auf 10.000 limitiere, nützt aber nix. Sobald es lange läuft oder in einer Zeile mehrere animierte GIF´s als Smiley´s kommen, steht das Programm (oder die GIF-Animation flackert/ruckelt sehr). Er kommt halt nicht mit dem Neuzeichnen nach.

Nen 2. Prob ist, das der HyperLinkListener immer 2* ausgelöst wird und somit der Link immer 2* im Browser geöffnet wird.

Liegt das an Swing bzw. habe ich das mit AWT nicht?
Kann mir da jemand weiterhelfen?
Oder hat wer ne bessere Lösung?

Danke im Vorraus
Nudel

PS.: Ich hatte das vorher mit JLabel´s in einem JPanel statt der JTextPane. Nur 1. hatte ich da den gleichen Effekt und 2. zusätzlich nen Problem mit dem Zeilenumbruch bei Text, der länger als die Scrollpane breit ist. Daher diese Lösung.

Code:
class MyPanel extends JTextPane {
HTMLEditorKit ek;
HTMLDocument doc;
RepaintManager rpm;
GUIChatTextPanel scrollpane; // eine JScrollPane
int max_doc_length = 10000;
 
public MyPanel(GUIChatTextPanel panel) {
scrollpane = panel;
doc = new HTMLDocument();
addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(HyperlinkEvent e) {
	if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
	 try {
	 BrowserLauncher.openURL(e.getURL().toString());
	 } catch (IOException e1) {
	 e1.printStackTrace();	 
	 }
	}
}
});
ek = new HTMLEditorKit();
setDocument(doc);
setEditorKit(ek);
ek.install(this);
setContentType("text/html");
setEditable(false);
rpm = RepaintManager.currentManager(this);
 
}
 
/**
* @param string
*/
public void addText(String string) {
if (string != null || string.length() >= 1) {
try {
	DeleteChars();
	sendString srr = new sendString(string);
	SwingUtilities.invokeAndWait(srr);
} catch (ArrayIndexOutOfBoundsException e) {
	e.printStackTrace();
} catch (InterruptedException e) {
	e.printStackTrace();
} catch (InvocationTargetException e) {
	e.printStackTrace();
}
}
}
 
// dreckig, da ich das HTMLDocument nicht wirklich verstehe
public void DeleteChars() {
try {
while (doc.getLength() >= max_doc_length) {
	doc.remove(0, 100);
}
} catch (BadLocationException e) {
e.printStackTrace();
}
 
}
 
private class sendString implements Runnable {
protected String s;
 
public sendString(String str) {
s = str;
}
 
public void run() {
doc = (HTMLDocument) getDocument(); 
try {
	//ek.insertHTML(doc, doc.getLength(), s, 0, 0, null);
	ek.insertHTML(doc, doc.getLength(), s, 0, 0, HTML.Tag.HTML);
} catch (IOException e) {
	System.err.println("IOException inserting HTML text." + e);
} catch (BadLocationException b) {
	System.err.println("BadLocationException inserting HTML text."+ b);
}
rpm.markCompletelyDirty(scrollpane.getViewport());
JScrollBar vsb = scrollpane.getVerticalScrollBar();
vsb.setValue(vsb.getMaximum());
 
}
}
}
 
Zurück