JTextPane - insertText beschleunigen

Status
Nicht offen für weitere Antworten.

0xdeadbeef

Top Contributor
Habe ein kleines Problem mit der Geschwindigkeit der Methode "insertText" von JTextPane.

Ich benutze ein JTextPane als Ausgabekonsole eines skriptfähigen Taschenrechners (http://home.arcor.de/0xdeadbeef/).
JTextPane nehme ich, um farbigen Text auszugeben. Außerdem brauche ich die Funktionalität zum Markieren und Kopieren von Text. Davon abgesehen ist JTextPane und das dahinterliegende Dokument viel zu aufgeblasen und langsam für meinen Anwendungszweck.

Den Text füge ich vom Parserthread aus in die JTextPane in der Oberflächenklasse ein und benutze dazu einen Listener (addListener usw.). Das erzeugt auch eine nicht unwesentliche Menge an Event-Objekten, aber das schien mir die sauberste Lösung zu sein.

Wenn ich mit dem Skriptparser des Taschenrechners in einer Schleife Text ausgebe, verbraucht insertText > 80% der Rechenzeit. Wolhbemerkt: das gesamte Parsen und Interpretieren meiner eigenen Skriptsprache - zumal nicht sonderlich optimiert - fällt überhaupt nicht ins Gewicht gegenüber der Ausgabe per JTextPane.

Trotz katastrophaler Performance könnte ich ja trotzdem noch damit leben, aber es kommt noch schlimmer:
Um so länger der Text im JTextPane wird, um so länger dauert das Einfügen. Dadurch kommt es bei gleichmäßig flotten Einfügen zu einer exponentiellen Verlangsamung der Textausgabe, bis sie schließlich ganz einfriert. Nach einigen tausend Texteinfügungen (jeweils ein paar Zeichen) friert dann offensichtlich das ganze Swing-Rendering ein, obwohl ich ja in einem eigenen Thread rechne und auch von dort aus den Text einfüge. Ich vermute, daß die Request zum Einfügen/Neuzeichnen schneller eintreffen, als sie abgearbeitet werden können, was früher oder später zum Exitus führt.

Daß das überhaupt passiert, muß bedeuten, daß nach dem Aufruf von insertText das Einfügen des Textes noch nicht komplett abgeschlossen ist. Ich vermute mal, daß das Update der Darstellung der JTextPane asynchron in irgendeinem Swing-Thread erfolgt. Und genau das bricht mir den Hals.

Ich habe jetzt wirklich eine Menge probiert (hauptsächlich Buffer-Strategien), aber irgendwie hatte keine Methode so richtig Erfolg. Und zwar wohl deshalb, weil damit zwar die Ausgabe schneller wird, das grundsätzliche Problem (Ausgaben treffen schneller ein als sie abgearbeitet werden) aber nicht gelöst wird.
Die einzige Methode, die Abhilfe schafft, ist es nach der Erzeugung des Listener-Events eine kurze Pause per Sleep einzufügen. Das scheint dem (postulierten) Swing-Thread Zeit zu geben, seine Ausgabe zu beenden, so daß es nicht zu der beschriebenen exponentiellen Anhäufung unausgeführter Insert-Requests kommen kann. Natürlich ist das extrem unsauber und häßlich. Außerdem verlangsamt sich dadurch die Textausgabe nochmals.

Was ich bräuchte, wäre eine Möglichkeit, meinen Parserthread so lange schlafen zu legen, bis der Swing-Thread mit dem Update des JTextPanes fertig ist. Leider habe ich eine solche Möglichkeit bislang nicht gefunden.
Irgendwelche Vorschläge???

Davon abgesehen wäre ich ganz allgemein an einem perfomanteren Ersatz für JTextPane interessiert, wobei ich mit einem extrem simplen Dokumentenmodell zufrieden wäre, solaneg man nur Text einfärben kann. Aber obwohl ich wirklich lange und intensiv rumgesurft bin, habe ich keinen geeigneten Ersatz gefunden. Kann es wirklich sein, daß es keine freie und effizient implementierte Klasse zur Erzeugung einer Konsolenausgabe mit farbigem Text gibt?
Ehrlich gesagt steht mir nicht wirklich de Sinn danach, mir sowas selber zu schreiben. Die Ausgabe wäre ja noch recht einfach, aber das ganze Markier-/Kopierzeugs muß ich nicht unbedingt selber zusammenzimmern...

Mich würde auch interessieren, ob es während des Einfärbens des Textes per setCharacterAttributes (zusätzliches Syntax-Highlighting) eine Möglichkeit gibt, das Neuzeichnen der JTextPane zu unterbinden, um die Geschwindigkeit zu erhöhen. Ich habe mit Doublebuffering mittels zweier Dokumente experimentiert (ins eine Schreiben, während das andere dargestellt wird), aber beim Umschalten kommt es zu unschönem Flackern.

Wäre für zielführende Hinweise dankbar.
 

0xdeadbeef

Top Contributor
Leider brauche ich das Wrapping, weil ich ja u.U. sehr große Zahlen ausgeben muß. Ich kann auch nicht so ganz glauben, daß das Ausschalten des Wrappings soviel bringt.

Und nochmal: Geschwindigkeit ist zunächst mal sekundär (obwohl sich da auch was tun sollte). Was mir IMHO den Hals bricht, ist die Nebenläufigkeit der Swing-Neuzeichnerei. Primär brauche ich also eine Möglichkeit, um auf das Ende des Neuzeichnens der JTextPane zu warten.
 

Wildcard

Top Contributor
Oxdeadbeef hat gesagt.:
Leider brauche ich das Wrapping, weil ich ja u.U. sehr große Zahlen ausgeben muß. Ich kann auch nicht so ganz glauben, daß das Ausschalten des Wrappings soviel bringt.
Ich kann jetzt nicht genau sagen woran es bei dir liegt, aber als ich mal einen Test gemacht hab mit 20000 Zeichen (oder so)
und LineWrapping hab ich zu meinem Entsetzen feststellen müssen das selbst nach dem setzen des Textes(was schon sehr lang dauert) die Anwendung nicht mehr bedienbar ist. Also ein ähnlicher Effekt wie du ihn festgestellt hast.
Ich würd's testhalber einfach versuchen, dann weißt du zumindest woran's liegt(oder eben nicht :wink: ).
Ocdeadbeef hat gesagt.:
Und nochmal: Geschwindigkeit ist zunöchst mal sekundär (obwohl sich da auch was tun sollte). Was mir IMHO den Hals bricht, ist die Nebenläufigkeit der Swing-Neuzeichnerei. Primär brauche ich also eine Möglichkeit, um auf das Ende des Neuzeichnens der JTextPane zu warten.
Fällt mir jetzt spontan auch nichts ein, weil ich nicht keine Ahnung hab wie Swing das intern regelt...
 

0xdeadbeef

Top Contributor
Ich habe zumindest für mein Hauptproblem (die Synchronisation) eine Lösung gefunden:
Nach dem insertString() kann man auf folgende Weise die Synchronisation mit dem Swing-Thread erzwingen:

Code:
// synchronize with AWT thread
try {
    SwingUtilities.invokeAndWait(new Runnable() {public void run() {}});
} catch (Exception e) {
    e.printStackTrace();
}

Damit kommt es zumindest nicht mehr zum Einfrieren der Oberfläche, wenn man zu schnell zu viel Text einfügt.
Schneller wird das Rendering natürlich nicht - aber immerhin besser als die Sleep-Variante.

BTW: eine HTML-Seite mit einem JEditorPane laden und darstellen ist ja auch erschreckend langsam.
Da kann man die Leute verstehen, die Java generell für lahm halten...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
J Swing JTextpane aktuallisiert nicht den setText? AWT, Swing, JavaFX & SWT 9
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
S Swing Style Attribute aus JTextPane kopieren AWT, Swing, JavaFX & SWT 1
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
TheJavaKid JTextPane: komplexe Formatierung (links) AWT, Swing, JavaFX & SWT 2
B Swing JTextPane - Einfärbungen auf "default" AWT, Swing, JavaFX & SWT 2
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
T Hintergrundbild in JTextPane fixieren AWT, Swing, JavaFX & SWT 2
M Swing JTextPane frisst Anführungszeichen AWT, Swing, JavaFX & SWT 2
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
H Swing JTextPane hat unästhetisches Scrollbar AWT, Swing, JavaFX & SWT 3
R Swing Renderproblem bei HTML in einer JTextPane AWT, Swing, JavaFX & SWT 12
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
Tobse Swing [JTextPane] Farbliche Hervorhebung AWT, Swing, JavaFX & SWT 9
X Swing JTextPane bei Größenänderung Formatierung behalten AWT, Swing, JavaFX & SWT 11
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
T Swing JTextPane Tastatureingabe abfangen AWT, Swing, JavaFX & SWT 4
B Durchsichtiges JScroll und JTextPane AWT, Swing, JavaFX & SWT 4
xehpuk Swing JTextPane in JScrollPane wird nicht ordentlich neugezeichnet AWT, Swing, JavaFX & SWT 3
S Swing JTextPane append formatprobleme AWT, Swing, JavaFX & SWT 5
C JTextPane / JEditorPane ohne Keywords farbig machen AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
S JEditorPane oder JTextPane? AWT, Swing, JavaFX & SWT 2
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
J JTextPane Background setzen AWT, Swing, JavaFX & SWT 6
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTextPane - bewegungsloses Hintergrundsbild (Duplikat) AWT, Swing, JavaFX & SWT 2
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
P Swing Sichtbaren teil eines JTextPane herausbekommen (mit JScrollPane) AWT, Swing, JavaFX & SWT 2
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
K Swing JTextPane Formatierungen SyntaxHighlighting AWT, Swing, JavaFX & SWT 11
F Mit TAB JTextPane wechseln AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
S Buchstabenpositionen in JTextPane erhalten..? AWT, Swing, JavaFX & SWT 5
I JTextPane und Hyperlink (ohne JEditorPane) AWT, Swing, JavaFX & SWT 5
T Swing JTextArea, JTextPane, JEditorPane...Unterschied?! AWT, Swing, JavaFX & SWT 3
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
P Drucken von Jtextpane mit Seitenangabe AWT, Swing, JavaFX & SWT 1
M Swing JTextPane mit JScrollPane soll aussehen wie JLabel AWT, Swing, JavaFX & SWT 3
A JTextPane: Text hinzufügen AWT, Swing, JavaFX & SWT 9
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
E Swing JTextPane linewrap AWT, Swing, JavaFX & SWT 4
M Swing [JTextPane] Cursor lässt sich nicht mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 3
T Swing xml in JTextPane mit EditorKit, StyledDocument & co. AWT, Swing, JavaFX & SWT 3
M Cursor setzen im JTextPane AWT, Swing, JavaFX & SWT 3
M Formatierungsfehler JTextPane WARUM ?? AWT, Swing, JavaFX & SWT 4
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
E JTextPane Bold Italic und Co AWT, Swing, JavaFX & SWT 6
M JTextPane Ende des Feldes AWT, Swing, JavaFX & SWT 4
D JTextPane - Text andersfarbig unterstreichen AWT, Swing, JavaFX & SWT 7
P Probleme mit JTextpane AWT, Swing, JavaFX & SWT 7
M Größe von JTextPane manuell bei Bedarf anpassen AWT, Swing, JavaFX & SWT 6
bugmenot JTextPane String stimmt nicht mit übergebenem String überein AWT, Swing, JavaFX & SWT 9
C JTextPane <br oder <p> statt \n AWT, Swing, JavaFX & SWT 2
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
G JTextPane durchsichtig? AWT, Swing, JavaFX & SWT 6
GilbertGrape Fehler bei HTML in JTextPane AWT, Swing, JavaFX & SWT 2
S JTextPane: Probem mit AlignmentAction AWT, Swing, JavaFX & SWT 3
J Problem mit JTextPane & JScrollPane (horizontal) AWT, Swing, JavaFX & SWT 3
B JTextPane und Image importieren in HTML String. AWT, Swing, JavaFX & SWT 2
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J Html in JTextPane anzeigen? AWT, Swing, JavaFX & SWT 2
Steev JTextPane mit Textformatierung funktioniert nicht AWT, Swing, JavaFX & SWT 5
S JTextPane - markierten Text Formatieren AWT, Swing, JavaFX & SWT 11
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
F JTextPane aktive Zeile AWT, Swing, JavaFX & SWT 2
G insert & JTextPane AWT, Swing, JavaFX & SWT 4
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
R JTextPane scrollen vermeiden AWT, Swing, JavaFX & SWT 2
B Feste Breite einer JTextPane, die HTML anzeigt AWT, Swing, JavaFX & SWT 8
A JScrollPane in JTextPane AWT, Swing, JavaFX & SWT 2
B Swing Logging: Ein/Ausblenden eines scrollenden JTextPane AWT, Swing, JavaFX & SWT 2
F Java JTextPane AWT, Swing, JavaFX & SWT 13
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
TheJavaKid LineWrap & WrapStyleWord in JTextPane AWT, Swing, JavaFX & SWT 3
G Zeilenabstand bei HTML-Texten in JLabel/JTextPane AWT, Swing, JavaFX & SWT 7
O Swing Xml highlightning mit JTextPane und Regular expressions AWT, Swing, JavaFX & SWT 5
J JTextPane Alignment AWT, Swing, JavaFX & SWT 6
Y entfernten String einer JTextPane per DocumentListener AWT, Swing, JavaFX & SWT 5
B Ein großes JTextPane komplett drucken AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben