HTML-Label

Mein Problem gerade ist recht einfach zu beschreiben: ich will einen Text mit HTML formatieren und darstellen können. In Swing konnten die Labels das out-of-the-box und in JavaFX … nicht. Das einzige was ich hier nach meinen Recherchen zufolge zur Verfügung habe ist die WebView. Diese schafft leider nur weitere Probleme:

  1. Der Hintergrund ist immer weiß (die Anwendung an sich ist aber dunkel). Durch setzen vom Blend-Modus ( Transparent background in the WebView in JavaFX - Stack Overflow ) könnte man das zwar in den Griff bekommen - aber keine Ahnung ob das nicht irgendwann mal Probleme macht.
  2. Das stylen wird erheblich verkompliziert. Styles die in der css-Datei definiert sind funktionieren damit nicht mehr.

Kennt ihr eine alternative - oder bin ich echt auf die WebView angewiesen?

In FX ist ein Label nur “als ganzes” formatierbar. Einzelne Teile zu formatieren ist nicht vorgesehen. Du musst also Dein “Gesamtlabel” aus verschiedenen einzelnen Zusammenstückeln, oder eben WebView nehmen.

Ich würde mir wohl ein neues Label aus einem FlowPane oder einem GridPane basteln, und da die Teile des Labels, die anders aussehen sollen, rein werfen.

bye
TT

Und genau das möchte ich umgehen. Der Text ist ja nicht hardcodiert sondern kommt aus Sprachdateien. Und genau dort wird eben gerne auch mal HTML verwendet. Eine ähnliche “Lösung” findet man auch auf google - dort wird das ganze aber mit TextFlow zusammengebaut (sorry, hab ich vergessen zu erwähnen).

Da würde ich noch eher die WebView vorziehen. Aber unterm Strich ist keins von beiden für mich eine wirklich zufrieden stellende Lösung.

Hab mir mal Gedacht: back-to-the-roots und das hier ausprobiert:

JLabel label = new JLabel("<html><b>Hallo</b><br /><u>welt</u></html>");
label.setOpaque(false);
SwingNode swingNode = new SwingNode();
swingNode.setStyle("-fx-text-fill: #ffffff;");  // <-- zeigt keine Wirkung
swingNode.setContent(label);```

Allerdings kann ich damit die Textfarbe nicht einfärben. Das könnte früher oder später zum Problem werden.

[quote=Tomate_Salat;136914]Der Text ist ja nicht hardcodiert sondern kommt aus Sprachdateien.[/quote]Also lokalisierte feste Texte oder was, dass die user verändern?

[quote=Tomate_Salat;136914]Und genau dort wird eben gerne auch mal HTML verwendet.[/quote]Dass man das gerne macht heißt noch nicht, dass das gut wäre…
Wenn es lokalisierte feste Texte sind kann man die sicher auch anders als mit HTML so strukturieren, dass man die Teiltexte in die “Farbrereiche” des Labels aufteilen kann.
Zur Not zerpflückt man das HTML eben mit ienem HTML-parser…

bye
TT

Richtig, sind lokalisierte Texte.

Geht mehr um Formatierungen (fett, unterstrichen, kursive, Umbrüche).

Naheliegende Lösung und mit WebEngine hat man auch gleich den parser zur Hand. Aber hatte gehofft das nicht nachbauen zu müssen.

Mein Vorschlag wäre (nicht wissend wie die restlichen Umstände sind) mit einem SwingNode zu arbeiten.

Damit kannst du ein normales JLabel in deiner JavaFX Anwendung benutzen.
Das kannst du dann wie gewohnt mit HTML füllen.

Hier mal ein Beispiel (mit dem ich getestet habe)


import java.lang.reflect.InvocationTargetException;
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/**
 *
 * @author 
 */
public class NewFXMain extends Application {
    
    @Override
    public void start(Stage primaryStage) throws InterruptedException, InvocationTargetException {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        JLabel label=new JLabel("Huston we have a normal label");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Let there be HTML");
                label.setText("<html>Huston we have a <b>bold</b> label</html>");
            }
        });
        SwingNode sn=new SwingNode();
        
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                sn.setContent(label);
            }
        });
        FlowPane root=new FlowPane();
        root.getChildren().addAll(btn,sn);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}

Mfg Clayn

Die Idee hatte ich auch schon ;-): https://forum.byte-welt.net/java-forum/awt-swing-javafx-swt/20919-html-label.html#post136914

Ich experimentier gerade damit rum - ob ich das styleable bekomme (zumindest mal mit -fx-text-fill-support).

gut, immerhin nicht grün. :smiley:

[QUOTE=Tomate_Salat;136918]Die Idee hatte ich auch schon ;-): https://forum.byte-welt.net/java-forum/awt-swing-javafx-swt/20919-html-label.html#post136914

Ich experimentier gerade damit rum - ob ich das styleable bekomme (zumindest mal mit -fx-text-fill-support).[/QUOTE]

Ah pardon ganz überlesen^^ Dabei wollte ich doch schauen, dass ich nichts schon gesagtes sage

Hallo.
Ich weiß das es dir nicht bei HTML helfen wird, doch zur Textgestaltung kann man in JavaFX auch mit https://docs.oracle.com/javase/8/javafx/api/javafx/scene/text/TextFlow.html arbeiten.
Ob es bequem ist sei mal dahingestellt aber vielleicht hilft es dir dein Ziel auf andere Art und Weise zu erreichen.