Textpane html text setzen

Hallo,

ich bin aktuell auf der Suche nach einer Lösung um den Text (html-Format) in einem Textpane zu setzen. Wenn ich einen Text setze wie zum Beispiel
Hallo
setzt das Textpane alles korrekt ausser die Textgröße. Die Textgröße wird wird immer mit 36 ausgegeben, unabhängig davon welche größe im HTML-text übergeben wird. Ich habe es schon mit einfachen setzen von textpane.setText(text) versucht oder über das StyledDocument. Das Ergebnis ist immer gleich. Hier mein aktueller Code zum Setzen des Textes. Mich verwirrt sehr das alles korrekt gesetzt wird, nur die Schriftgröße ist falsch. :frowning:

 private void setStartValues() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    String text = "<html><font size=\"7\" face=\"Arial Black\"  color=\"#f55fff\"><b>Hallo</b></font></html>";
                    HTMLEditorKit htmlEdit = new HTMLEditorKit();
                    HTMLDocument document = (HTMLDocument) htmlEdit.createDefaultDocument();
                    StringReader sr = new StringReader(text);
                    htmlEdit.read(sr, document, 0);
                    textPane.setDocument(document);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

Hier das Ergebnis:

ich hoffe es jemand eine Idee, wodran das liegen kann.
Vielen dank für die Unterstützung im voraus

Probier mal einfach nur:


String text = "<html><font size=7 face=\"Arial Black\"  color=\"#f55fff\"><b>Hallo</b></font></html>";

Bewirkt das etwas?

Edit:
Ich bearbeite mal hier in der Hoffnung, dass der Beitrag nicht von einem Mod dann nochmal geprüft werden muss.
Meine Idee bei der Erstellung des Beitrags war eine andere.

Guck mal in die API, dort steht:

If doc is an instance of HTMLDocument, this will read HTML 3.2 text.

Wenn man jetzt in die HTML 3.2 Referenz guckt, gehen also für size nur die Werte 1-7:

size
This sets the font size for the contents of the font element. You can set size to an integer ranging from 1 to 7 for an absolute font size, or specify a relative font size with a signed integer value, e.g. size=„+1“ or size=„-2“. This is mapped to an absolute font size by adding the current base font size as set by the BASEFONT element (see below).


<!ELEMENT FONT - - (%text)*     -- local change to font -->
<!ATTLIST FONT
    size    CDATA   #IMPLIED    -- [+]nn e.g. size="+1", size=4 --
    color   CDATA   #IMPLIED    -- #RRGGBB in hex, e.g. red: color="#FF0000" --
    >

Oder total daneben?

hast du die Werte 1-7 getestet? die scheinen unterstützt zu sein, wie auch irgendein HTML-Standard:
HTML font size Attribute

desweiteren finde ich gerade noch
Java Code Example javax.swing.text.html.HTMLEditorKit
was wohl nur dynamisch Code-Beispiele zusammenstellt, ich meine dort jedenfalls in meinem Fund Code a la

        if (isItalic) {
            fontCSS = fontCSS + "font-style:italic;";
        } else {
            fontCSS = fontCSS + "font-style:normal;";
        }
        if (isBold) {
            fontCSS = fontCSS + "font-weight:bold;";
        } else {
            fontCSS = fontCSS + "font-weight:normal;";
        }

..

        HTMLEditorKit kit = new HTMLEditorKit();
        setEditorKit(kit);
        javax.swing.text.html.StyleSheet styleSheet = kit.getStyleSheet();
        styleSheet.addRule("body {" + fontCSS + "}");

funktioniert bei mir kurz getestet, wenn auch vielleicht schwierig damit dynamisch unterschiedliche Font je Text-Zeile zu setzen wie mit font-Tag…


grundsätzlich aber in 5 Min. keine ordentliche Übersichtserklärung zu ‘java swing font size html’ gefunden,
was für sich in jedem Fall traurig ist


Meine Idee hinter meinem Beitrag.
In der API steht:

If doc is an instance of HTMLDocument, this will read HTML 3.2 text.

Und in der HTML 3.2 Ref steht:


<!ELEMENT FONT - - (%text)*     -- local change to font -->
<!ATTLIST FONT
    size    CDATA   #IMPLIED    -- [+]nn e.g. size="+1", size=4 --
    color   CDATA   #IMPLIED    -- #RRGGBB in hex, e.g. red: color="#FF0000" --
    >

Also ohne „Gänsefüßchen“.

Weiteres in meinem oben editierten Beitrag.

Hallo,

vielen dank für eure Antworten.
Also ich habe nun getestet und es scheint wirklich am HTML 3.2 zu liegen. Wen ich die Schriftgröße von 1-7 ändere, ändert sich die Schriftgröße entsprechend.
7 = 36
6 = 24

2 = 10
1 = 8

Das heißt die Ursache ist gefunden “Top”.
Da ich meinen HTML Text jedoch mit absoluten Größen und Zeile für Zeile bekomme, muss ich im Programm die Größe absolut setzen können. Dafür habe ich auf die schnelle noch keine Lösung gefunden, ich google aber mal weiter.

Wenn ihr dafür eine Lösung habt, bin ich natürlich dankbar.

TextSamplerDemo aus offiziell How to Use Editor Panes and Text Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
kann es zumindest technisch mit StyleConstants, aber mit HTML hat das nicht mehr viel zu tun,
oder vielleicht doch nach CSS-Weg…, aber weniger ineinander verschachtelte Tags

eigenen Text kann man damit vielleicht zusammenklicken, fertiges HTML von außen hieße wohl aufwendig zu parsen,
macht letztlich jeder Browser nicht anders, aber wohl nicht als Aufgabe erhofft :wink:

fertige Frameworks?
SHEF - Swing HTML Editor Framework
gerade gesehen, ziemlich groß falls sonst schon zufrieden bis auf fehlende Font-Size-Unterstützung…,
aber womöglich ja auch noch viel mehr Lücken im einfachen Swing-HTML

Hallo,

vielen Dank für die Tips. Nach nun lange hin und her testen, habe ich mich entschieden das Format von HTML auf RTF zu ändern.
Vorteil: Man kann jede Schrift und jede Schriftgröße sowie Farbe setzen und abspeichern.

Wird der Text neu geladen, kann dieser direkt mit folgendem Code gesetzt werden.

String text = "Hallo";
textPane.setText(text);

Im JTextpane muss dazu nur der Content wie folgt gesetzt werden.

 
textPane.setContentType("text/rtf");

Jetzt funktioniert es wunderbar.

Vielen Dank nochmal, eure Antworten haben mich auf den richtigen Weg gebracht.
Und brachte die Erkenntnis „HTML ist nicht wirklich zu gebrauchen“ :smiley: