# Mit JLabel HTML - formatierten Text anzeigen



## Haefel (16. Jan 2010)

Hi,

weiß jemand ob man den automatischen Zeilenumbruch bei HTML formatiertem Text im JLabel umgehen kann?
Oder gibt es noch eine andere Möglichkeit nicht zu editierenden Text(HTML - Formatiert) auszugeben? ???:L

Gruß


----------



## U2nt (16. Jan 2010)

Ne in nem JLabel geht das nicht, kannst aber das Font ändern via
setFont(Font);

HTML kannste mit nem JEditorPane machen glaub ich


----------



## Ebenius (17. Jan 2010)

Verwende doch non-breaking spaces ([c]&nbsp;[/c]) statt SPC. Oder verwende ein [c]<pre>[/c]-Tag. Sowas also:


```
final String html =
      "<html><body>"
            + "This is a very very very very very very very very very very "
            + "very very very very very very very very very very very very "
            + "very long line of text"
            + "</body></html>";

final JPanel contentPane = new JPanel(new GridLayout(2, 1, 6, 6));

// NBSP instead of SPC
contentPane.add(new JLabel(html.replaceAll(" ", "&nbsp;")));

// PRE-Tag inside BODY
contentPane.add(new JLabel(html.replaceAll("(<body>)", "$0<pre>")
      .replaceAll("</body>", "</pre>$0")));

final JFrame f = new JFrame("Test Frame: JLabelHTML"); //$NON-NLS-1$
f.setContentPane(contentPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
```
@U2NT, meintest Du, dass ein JLabel kein HTML kann? Da liegst Du falsch. JLabel, JButton und einige andere Komponenten unterstützen HTML. Siehe Sun Java™ Tutorials: How to Use HTML in Swing Components.

Ebenius


----------



## U2nt (17. Jan 2010)

Habs verwechselt dachte is kein Label sondern ein JPanel :S


----------



## phillnet (20. Jul 2010)

Hallo,

die Tipps von Ebenius haben mir bei meinem Problem schon ein wenig weiter geholfen, aber die Lösung ist leider noch nicht perfekt.

Bild 1 (title_01.png) zeigt ein JLabel welches mit HTML formatiert wurde. Leerzeichen wurden mit _&nbsp;_ ersetzt.
Bild 2 (title_02.png) zeigt ein JLabel welches nicht mit HTML formatiert wurde.

Es geht mir um die "Punkte" (...) am Ende der JLabels (s. Bild 2). Diese sehr schöne Lösung für einen zu langen Text funktioniert leider nicht bei HTML kodiertem Text (s. Bild 1).

Meine Fragen:
1. Gibt es eine Möglichkeit, diese Funktion auch für HTML kodierte Texte einzuschalten (z.B. in Java 7)?
2. Wenn nicht: Wie sollte ich beim selbstständigen programmieren einer Lösung am besten vorgehen?
2a. Wo wird in Java diese Formatierung vorgenommen (Source Code)?
2b. Wo ist die Java Methode, die die HTML Tags aus dem String entfernt?
Ich denke nämlich, dass eine Kombination beider Methoden das gewünschte Ergebnis liefern könnte.

Vielen Dank schonmal und einen schönen Abend noch


----------



## Ebenius (20. Jul 2010)

phillnet hat gesagt.:


> 1. Gibt es eine Möglichkeit, diese Funktion auch für HTML kodierte Texte einzuschalten (z.B. in Java 7)?


Würde mich stark wundern.


phillnet hat gesagt.:


> 2. Wenn nicht: Wie sollte ich beim selbstständigen programmieren einer Lösung am besten vorgehen?
> 2a. Wo wird in Java diese Formatierung vorgenommen (Source Code)?
> 2b. Wo ist die Java Methode, die die HTML Tags aus dem String entfernt?
> Ich denke nämlich, dass eine Kombination beider Methoden das gewünschte Ergebnis liefern könnte.


Ich denke das nicht. Du stellst Dir das ein ganzes Stück zu einfach vor. HTML in Komponenten ist nicht trivial. Du machst nur ein bisschen Text, aber es könnte sich ja auch um Tabellen mit Bildern und dergleichen handeln. Die HTML-Darstellung kann schlecht ein Bild abschneiden und irgendwo drei Punkte hinmalen, weil sie keine Ahnung darüber hat, wo die Punkte denn passen würden.

Die Darstellung eines JLabel wird über dessen UI-Delegate gelöst (i.d.R. BasicLabelUI und deren Ableitungen). Zur HTML-Darstellung wird (nicht zwangsweise aber von allen mir bekannten Look And Feels) die BasicHTML-Klasse benutzt. Diese verteilt die Darstellung per BasicHTMLViewFactory, HTMLEditorKit und HTMLDocument auf viele verschiedene javax.swing.text.View-Ableitungen. Auf die Schnelle fällt mir da keine einfache Lösung ein.

Ebenius


----------



## jared (16. Aug 2010)

Hi!!!
Habe auch so ein ähnliches Problem. Mit dem JEditorPane zeigt er mir mein HTML-Code korrekt an, benutze ich aber JLabel, wird mir nichts angezeigt. Woran könnte dies liegen??
JEditorPane kann ich nicht benutzen, da ich dadurch nicht sehe, was darunter liegt. Ich muss aber sehen, was unter diesen liegt, gäbe es hierfür vllt eine Möglichkeit den Hintergrund transparent zu machen??

mfg


----------



## Michael... (16. Aug 2010)

```
setOpaque(false)
```
 sollte auch für JEditorPane funktionieren.


----------



## jared (16. Aug 2010)

Danke.
HTML-Text wird mehr oder weniger ausgegeben und der Background ist auch Transparent. 
Kann man eig nur ein JEditorPane pro Anwendung benutzen oder kann man mehrere instanziieren?? Denn bei mir wird der Text überlagert ausgegben.

mfg


----------



## Michael... (16. Aug 2010)

jared hat gesagt.:


> Kann man eig nur ein JEditorPane pro Anwendung benutzen oder kann man mehrere instanziieren??


Man kann beliebig viele (zumindest solange Speicher verfügbar ist) Instanzen von JEditorPane erzeugen und verwenden. Eine Instanz kann man nur allerdings nur einmal in einer GUI verbauen.


jared hat gesagt.:


> Denn bei mir wird der Text überlagert ausgegben.


Muss man jetzt nicht verstehen?


----------



## jared (16. Aug 2010)

Habe gerade erst noch ein anderes Problem zu lösen, danach versuche ich es noch einmal zu erklären.


----------



## jared (19. Aug 2010)

Habe es jetzt endlich so implementiert das es eher weniger als mehr angezeigt wird. 
Ohne jetzt erst weiter auf mein Problem einzugehen, gibt es außer JEditorPane  noch andere Klassen bzw. Elemente, die HTML-Text anzeigen können???

mfg


----------



## Ebenius (19. Aug 2010)

jared hat gesagt.:


> […]gibt es außer JEditorPane  noch andere Klassen bzw. Elemente, die HTML-Text anzeigen können???


Standardgemäß bieten diese Swing-Komponenten Basic HTML Support: JLabel, AbstractButton (also JButton, JRadioButton, JToggleButton), JMenuItem (eigentlich auch ein AbstractButton) und damit auch dessen Derivate (JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem), JTabbedPane, JToolTip.

Ebenius


----------



## jared (20. Aug 2010)

JLabel funktioniert bei mir aber nicht. Bedeutet, wenn ich z. B. "<html>Hallo</html>" verwende, zeigt er mir nichts an. Oder ist das HTML-Statement, ich sage jetzt ma, zu einfach?? muss ich evtl doch den body-tag angeben oder wie??

mfg


----------



## jared (20. Aug 2010)

Was mir gerade einfällt, woran es liegen könnte. Also ich habe mehrere Objekte von einer Klasse, die von JPanel erbt. Diese Klasse legt, die jeweilige Größe des JPanels fest. Innerhalb dieses, zeichne ich, z. B. ein Rechteck oder ein Rechteck mit abgerundeten Ecken,... . Ich denke nun, dass das JLabel und das JEditorPane wegen diesem Zeichnen nicht korrekt angezeigt wird. Das JLabel wird mit dem Inhalt nie angezeigt und das JEditorPane erst, nachdem ich mit dem einen Objekt, der obigen Klasse, ein Drag and Drop ausführe und selbst dann sind noch einige Bugs damit verbunden. 
Kennt jemand noch eine andere Möglichkeit?? oder woran es vllt liegen könnte??


----------

