Mały problem z kodem html w JTextPane

0

Witam,
mam jTextPane z kodem html, w którym często zmienia się zawartość, tzn. jest dopisywana linijka do końca co pewien czas. Wygląda to mniej więcej tak:

jTextPane1.setText(edit(jTextPane1.getText()) +"<br>" + input.replaceAll("\0", ""));
//...
    private String edit(String str)
    {
        return str.replaceAll("<html>", "").replaceAll("</html>", "").replaceAll("<body>", "").replaceAll("</body>", "").replaceAll("<head>", "").replaceAll("</head>", "").replaceAll("\n", "");
    }

Problem jest w tym, że takie dopisywanie trwa zbyt długo, ponieważ aplikacja lekko się zacina(działa mniej płynnie) i jTexPane miga(przy pojawianiu się nowych linii).
Jest jakiś sposób, aby pobrać zawartość jTextPane bez tych znaczników w funkcji edit, które są generowane automatycznie? Lub czy jest jakiś inny sposób na zoptymalizowanie tej operacji?
Z góry dziękuje za odpowiedź.

0

Metodę edit() powinieneś wykonywać tylko na nowym wierszu. Prawdopodobnie (przy długim tekście) szybciej będzie jeśli nie będziesz korzystał z operatora konkatenacji. Utwórz zmienną sb typu StringBuilder, przechowuj w niej zawartość pola tekstowego. Wyowołuj

sb.append("<br>"+edit(nowaLinia));
jTextPanel.setText(sb);
0

Skoro dodajesz tylko coś, oraz używasz HTML do formatowania, to rozwiązanie jest: nie zmieniaj całego tekstu w textPane za pomocą setText, tylko dopisuj do niego ;) Ustaw sobie jawnie w textPane właściwość contentType na text/html - bo inaczej się wywali - i ustawiaj sobie test za pomocą:

public static void setText(JTextComponent view, String text) {
    try {
        HTMLDocument doc = (HTMLDocument)view.getDocument();
        Element root     = doc.getDefaultRootElement();
        Element body     = doc.getElement(root, StyleConstants.NameAttribute, HTML.Tag.BODY);
        doc.setInnerHTML(body, text);
    } catch(IOException cause) {
        throw new AssertionError(cause);
    } catch(BadLocationException cause) {
        throw new AssertionError(cause);
    } catch (ClassCastException cause) {
        throw new IllegalStateException("editor must support text/html", cause);
    }
}

A do dodawania będzie bardzo podobnie:

public static void appendText(JTextComponent view, String text) {
    try {
        HTMLDocument doc = (HTMLDocument)view.getDocument();
        Element root     = doc.getDefaultRootElement();
        Element body     = doc.getElement(root, StyleConstants.NameAttribute, HTML.Tag.BODY);
        doc.insertBeforeEnd(body, text);
    } catch(IOException cause) {
        throw new AssertionError(cause);
    } catch(BadLocationException cause) {
        throw new AssertionError(cause);
    } catch (ClassCastException cause) {
        throw new IllegalStateException("editor must support text/html", cause);
    }
}

w użyciu to by wyglądało jakoś tak:

setText(jTextPane1, "<div>abc</div>");
// ...
appendText(jTextPane1, "<div>1</div>");
appendText(jTextPane1, "<div>2</div>");
appendText(jTextPane1, "<div>3</div>");
0

Wielkie dzięki!
Właśnie o to mi chodziło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1