Swing JTextPane sehr langsam

AMiGA

Bekanntes Mitglied
Hallo zusammen,

ich benutze ein JTextPane, um aufbereitete HTML-Dateien darzustellen. Die Dateien sind zwischen 500k und 2MB groß. Das JTextPane liegt auf einem scrollbaren Panel:

Java:
import java.awt.*;

import javax.swing.*;
import javax.swing.text.html.*;

public class MyPanel extends JScrollPane
{
    public MyPanel()
    {
        super();

        setAutoscrolls(true);
        
        JPanel panelText = new JPanel();
        panelText.setLayout(new BorderLayout());
        setViewportView(getPanelText());
        setSize(300, 200);
        getVerticalScrollBar().setBlockIncrement(100);
        getVerticalScrollBar().setUnitIncrement(10);
    }

    private JPanel getPanelText()
    {
        JPanel panelText = new JPanel();
        panelText.setLayout(new BorderLayout());
        panelText.add(getTextPane(), java.awt.BorderLayout.CENTER);
        return panelText;
    }
    
    private JTextPane getTextPane()
    {
        JTextPane textPane = new JTextPane();
        textPane.setContentType("text/html");
        textPane.setDocument(new HTMLDocument());
        textPane.setDoubleBuffered(true);
        textPane.setEditorKit(new HTMLEditorKit());
        textPane.setHighlighter(new LineHighlighter(Color.ORANGE));
        textPane.addMouseListener(new java.awt.event.MouseAdapter() 
        {
            @Override
            public void mousePressed(java.awt.event.MouseEvent e)
            {
//                listener.mouseClicked();
            }
        });
//        textPane.addCaretListener(new TextPaneCaretListener());
        return textPane;
    }

}

Wenn ich das JTextPane nun mit Daten fülle, dauert dies bis zu 5 Sekunden! Ich erstelle mir mittlerweile die HTML-Datei selber schon im Speicher (StringBuffer, der einen String von ca. 2.5 Mio. Zeichen ergibt), wodurch es minimal (0,3 Sekunden) schneller geworden ist. Aber letztendlich dauert das Einlesen immer noch viel zu lange.

Java:
//
textPane.getEditorKit().read(new StringReader(bigString), textPane.getDocument(), 0);
//

Hat vielleicht irgend jemand eine Idee, was ich falsch mache?

Gruß,
AMiGA
 
*schubs*

Hat niemand ähnliche Erfahrungen gemacht?

Gibt es vielleicht andere (performantere) Möglichkeiten, HTML-Dateien darzustellen?

Gruß,
AMiGA
 
Folgende Lösung macht auf mich den performantesten Eindruck:

Java:
HTMLDocument doc = new HTMLDocument();
new HTMLEditorKit().read(new StringReader(bigHtmlString), doc, 0);
textPane.setDocument(doc);

Der HTML-Inhalt wird zunächst als sehr großer String aufbereitet. Aus diesem wird ein HTML-Dokument erzeugt. Das Dokument selber wird nur noch an das JTextPane gehängt. Es ist immer noch relativ langsam aber schon etwas schneller als die vorherige Variante.

Gruß,
AMiGA
 
Ich bin immer noch nicht wirklich zufrieden mit der oben beschriebenen Variante. Alleine der Aufruf von
Java:
setDocument
dauert bei einem etwas größeren HTML-Dokument (angezeigt werden rund 10.000 Zeilen) ca. 2,7 Sekunden. Das ist nicht wirklich akzeptabel finde ich.

Kennt vielleicht jemand brauchbare Alternativen zu JTextPane? Eventuell freie Bibliotheken, welche die Funktionalität (HTML-String auf einem Panel darstellen) abbilden?

Gruß,
AMiGA
 
Ich hab jetzt nix ausprobiert, aber hast du einfach mal

Java:
 textPane.setText(bigHTMLString);

benutzt anstatt der ganzen komplexen Reader etc.?

edit: Stellt sich mir natürlich die Frage, was du alles für Funktionalitäten brauchst
 
Zuletzt bearbeitet:
Ich hab jetzt nix ausprobiert, aber hast du einfach mal
Java:
textPane.setText(bigHTMLString);
benutzt anstatt der ganzen komplexen Reader etc.?
Ja, das ist leider noch langsamer, da es intern das Document erweitert, was am JTextPane hängt. Schneller ist es, zunächst das Document zu erzeugen und es erst danach ans JTextPane zu hängen.

Stellt sich mir natürlich die Frage, was du alles für Funktionalitäten brauchst
Möchte gerne HTML darstellen (wird genutzt, um Logdateien farblich darzustellen). Per Popup möchte ich Zeilen anspringen können, etc, das wird aber alles drumherum programmiert, genau wie beim JTextPane.

Gruß,
AMiGA
 
Ich habe testweise DJNativeSwing (siehe The DJ project) genutzt, um den HTML-String darzustellen. Beim JTextPane dauerte es ca. 2,7 Sekunden, bei JWebBrowser dauert es ca. 0,1 Sekunden!

Leider habe ich dort keine Möglichkeit, die caret-Funktionalitäten (setCaretPosition, etc.) von JTextComponent zu nutzen. Daher weiß ich nicht, auf welche Zeile der Benutzer geklickt hat, kann die Zeile nicht markieren, kann keine Zeile anspringen, etc.

Jetzt stellt sich natürlich die Frage, ob man die Performance des JTextPanes nicht irgendwie verbessern kann. Der Unterschied zwischen 2,7 Sekunden und 0,1 Sekunden ist ja erheblich.

Gruß,
AMiGA
 

Neue Themen


Zurück
Oben