html-Text mit Formatierung in String speichern

Herr Kaiser

Bekanntes Mitglied
Hallo Forum,

ich möchte einen formatierten html-Text als String speichern, so dass die Formatierungsinformationen erhalten bleiben.

Zum Testen habe ich die zwei JEditorpPanes epQuelle und epZiel erstellt. In der Quelle formatiere ich den Text (funktioniert), in Zeile 38 packe ich ihn in einen String, um ihn dann ins epZiel einzufügen. Der Text erscheint dort, allerdings unformatiert. Offensichtlich werden die Formatierungs-Tags mittels doc.getText verschluckt. Ich habe es auch mit epQuelle.getText und epQuelle.getDocument().getText versucht. In Zeile 43 habe ich auch epZiel. setText probiert. Das hat alles nichts gebracht.

Was mache ich hier falsch? 😳

Java:
public static void test() {

    // Vorbereitung
    HTMLEditorKit html = new HTMLEditorKit();
    SimpleAttributeSet atts = new SimpleAttributeSet();
    epQuelle.setContentType("text/html");
    epQuelle.setEditorKit(html);
    epZiel.setContentType("text/html");
    epZiel.setEditorKit(html);
    StyledDocument doc = (StyledDocument) epQuelle.getDocument();

    // Text in Quelle einfuegen
    try {
        epQuelle.getDocument().insertString(0, "fett kursiv unterstrichen", null);
    } catch (Exception e) {
        System.out.println("Fehler" + e);
    }

    // Formatierungen
    epQuelle.setSelectionStart(0);
    epQuelle.setSelectionEnd(4);
    StyleConstants.setBold(atts, true);
    doc.setCharacterAttributes(epQuelle.getSelectionStart(), epQuelle.getSelectionEnd() - epQuelle.getSelectionStart(), atts, false); // fett
    epQuelle.setSelectionStart(5);
    epQuelle.setSelectionEnd(12);
    StyleConstants.setBold(atts, false);
    StyleConstants.setItalic(atts, true);
    doc.setCharacterAttributes(epQuelle.getSelectionStart(), epQuelle.getSelectionEnd() - epQuelle.getSelectionStart(), atts, false); // kursiv
    epQuelle.setSelectionStart(12);
    epQuelle.setSelectionEnd(25);
    StyleConstants.setItalic(atts, true);
    StyleConstants.setUnderline(atts, true);
    doc.setCharacterAttributes(epQuelle.getSelectionStart(), epQuelle.getSelectionEnd() - epQuelle.getSelectionStart(), atts, false); // unterstrichen

    // Text in String speichern und einfuegen
    String htmlText = "";
    try {
        htmlText = doc.getText(0, doc.getLength());
    } catch (Exception e) {
        System.out.println("Fehler" + e);
    }
    try {
        epZiel.getDocument().insertString(0, htmlText, null);
    } catch (Exception e) {
        System.out.println("Fehler " + e);
    }
}
 
Was mache ich hier falsch? 😳
Was willst du erreichen?`Soll JEditorPane automatisch die benötigten Tags für fett, kursiv, etc. einsetzen und den sich dadurch ergebenden String willst du dann ändern, oder willst du einen HTML-String formatieren, quasi wie ein Editor mit Syntax-Highlighting für HTML?
Ersteres dürfte so nicht funktionieren und du müsstest selbst die entsprechenden Tags einfügen, letzteres sollte sich dadurch erreichen lassen, dass du das StyledDocument statt des Strings speicherst.
 
Sorry, ich muss das Thema doch noch einmal aufmachen.
Ich möchte den formatierten Text zwischenspeichern und habe festgestellt, dass sich das StyleDocument dazu logischerweise nicht eignet, weil es sich ja ändert, sobald sich der Inhalt des zugrundeliegenden EditorPanes ändert.

Ich müsste also doch irgendwie an den String kommen, der den formatierten html-Text enthält. Wenn ich also "fett kursiv unterstrichen" in das Editorpane schreibe, müsste ich eine Methode finden, die mir dann ungefähr folgenden String zurückgibt:

<html> <head> </head> <body> <p style="margin-top: 0"> <b>fett</b> <i>kursiv</i> <u>unterstrichen </u> </p> </body></html>

Ich kriege das derzeit nur über Umwege hin, indem ich den Inhalt des EditorPanes mit der Methode EditorKit.write in ein file schreibe und anschließend diese Datei in einen String einlese, Aber das ist vermutlich unnötig kompliziert und nicht sonderlich performant.

Kann mir jemand sagen, wie ich auf direkterem Weg an obigen html-Code herankomme?
 
Ich hab's mir jetzt so hingebastelt:

Java:
private String htmlToString(HTMLEditorKit ek, StyledDocument doc) {

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    try {
        ek.write(bout, doc, 0, doc.getLength());
    } catch (Exception e) {
        System.out.println(e);
    }
    return bout.toString();
}

Wenn's noch simpler geht (ganz ohne Umweg über einen OutputStream), lasst es mich ruhig wissen. Ansonsten funktioniert diese Lösung schonmal ganz gut. Danke für's Gedankenmachen! 🙂
 

Zurück
Oben