web-dev-qa-db-fra.com

Mettre une portion de texte en gras dans une étiquette ou un texte JavaFx

Dans mon application JavaFx, il me faut un mot ou deux en gras dans la phrase. Actuellement, la phrase est rendue sous la forme d'une étiquette JavaFx, mais la mise à niveau du composant ne m'autorise pas non plus à définir le texte de manière à pouvoir afficher les mots "Exemple" en gras.

String s = "This is a <b>Sample</b> sentence"
Label label = new Label(s);

sortie 

C'est un Échantillon  phrase

JavaFx Text ne le permet pas non plus. Y a-t-il un composant où je peux avoir une partie du texte en gras?

Je ne suis pas sûr que JavaFx WebView soit une bonne idée pour le rendu de nombreuses petites phrases dans une fenêtre.

28
Neil

Il est possible d'utiliser le conteneur TextFlow à partir de JavaFX8 . Vous pouvez ensuite facilement y ajouter des nœuds Text de styles différents.

TextFlow flow = new TextFlow();

Text text1=new Text("Some Text");
text1.setStyle("-fx-font-weight: bold");

Text text2=new Text("Some Text");
text2.setStyle("-fx-font-weight: regular");

flow.getChildren().addAll(text1, text2);

Le conteneur TextFlow encapsulera automatiquement le contenu des nœuds de texte.

enter image description here

45
Ernisto

Update: JavaFX 8 fournit un nouveau contrôle pour le texte enrichi: TextFlow


Malheureusement, cette fonctionnalité n'existe pas dans la version 2.2, bien qu'elle puisse être incluse dans la prochaine version.

Pour l'instant, vous pouvez essayer d'utiliser les approches suivantes:

  1. HBox avec plusieurs composants Label ou Text
  2. WebView
  3. Toile avec plusieurs composants de texte dessinés
10
Sergey Grinev

Etant donné que les réponses précédentes n'incluaient pas le code FXML, j'en publierai un supplémentaire.

Comme suggéré par @Ernisto, vous pouvez utiliser un TextFlow qui contient Text parts, où chaque partie peut être stylée différemment.

Exemple de contenu de fichier FXML

<TextFlow>
  <Text text="Normal text and "/>
  <Text text="bold text and " style="-fx-font-weight: bold"/>
  <Text text="italic text and " style="-fx-font-style: italic"/>
  <Text text="red text." style="-fx-stroke: red"/>
</TextFlow>

Sortie:

 enter image description here

6
Markus Weninger
public class UtilsDialog {

    private static final String TAG = "UtilsDialog";

    private static boolean sIsShowing = false;

    public static void showDialogShowError(String title, String msg, String defaultStyle,
                                           @Nullable String customStyle, String... styledWords) {
        if (sIsShowing) return;

        Stage dialogStage = new Stage(StageStyle.UTILITY);
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        dialogStage.setWidth(400);
        dialogStage.setHeight(220);

        BorderPane borderPane = new BorderPane();

        borderPane.setPadding(new Insets(15));
        borderPane.setPrefWidth(Integer.MAX_VALUE);
        borderPane.setPrefHeight(Integer.MAX_VALUE);

        Scene scene = new Scene(borderPane);
        dialogStage.setScene(scene);
        sIsShowing = true;
        dialogStage.show();
        UtilsGui.closeOnEsc(borderPane, scene);
        scene.addEventHandler(KeyEvent.KEY_PRESSED, t -> {
            if (t.getCode() == KeyCode.ESCAPE) {
                sIsShowing = false;
            }
        });

        // Top
        Text textTitle = new Text(title);
        textTitle.setStyle("-fx-font-size: 18px;");

        HBox hBoxTop = new HBox(10);
        hBoxTop.getChildren().addAll(textTitle);
        borderPane.setTop(hBoxTop);

        // Center
        TextFlow textFlow = new TextFlow();
        List<String> words = Arrays.asList(msg.split(" "));
        List<String> styledWordsList = Arrays.asList(styledWords);
        for (String Word : words) {
            Text tmpWord = new Text(Word);
            if (styledWordsList.contains(Word
                    .replace(".", "")
                    .replace(",", "")
                    .replace("?", "")
                    .replace("!", "")
                    .replace(";", "")
                    .replace("\n", "")
            )) {

                tmpWord.setStyle(customStyle);
            } else {
                if (defaultStyle == null) {
                    tmpWord.setStyle("");
                } else {
                    tmpWord.setStyle(defaultStyle);
                }
            }
            tmpWord.setText(tmpWord.getText());
            textFlow.getChildren().add(tmpWord);
            textFlow.getChildren().add(new Text(" "));
        }
        Text textMsg = new Text(msg);
        textMsg.setStyle("-fx-font-size: 14px;");
        HBox hBoxInputPane = new HBox(10);
        hBoxInputPane.setAlignment(Pos.CENTER);

        VBox vBoxCenter = new VBox(10);
        vBoxCenter.setPadding(new Insets(25, 0, 15, 0));
        vBoxCenter.getChildren().addAll(textFlow);
        borderPane.setCenter(vBoxCenter);

        JFXButton btnOk = new JFXButton("OK");
        btnOk.setAlignment(Pos.CENTER_RIGHT);
        btnOk.setStyle("-fx-text-fill: WHITE; -fx-background-color: #5264AE; -fx-font-size: 14px;");
        btnOk.setOnAction(event -> {
            sIsShowing = false;
            dialogStage.close();
        });

        // Bottom
        HBox hBoxBottom = new HBox();
        final Pane spacer = new Pane();
        HBox.setHgrow(spacer, Priority.ALWAYS);
        hBoxBottom.getChildren().addAll(spacer, btnOk);
        borderPane.setBottom(hBoxBottom);

        // store on close
        dialogStage.setOnCloseRequest(event -> sIsShowing = false);
    }
}

appel:  

UtilsDialog.showDialogShowError("Test", "This is the message to show. Does it work?",
                null, "-fx-font-weight: bold", "This", "message", "show");
0
Martin Pfeffer