Подтвердить что ты не робот

Сделайте часть текста полужирным в ярлыке JavaFx или тексте

В моем приложении JavaFx мне нужно иметь слово или два, выделенные жирным шрифтом во всем предложении. В настоящее время предложение отображается как ярлык JavaFx, но компонент обновления также не позволяет мне устанавливать текст так, чтобы я мог иметь выделенные жирным шрифтом слова "Образец".

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

вывод

This is a Sample sentence

Текст JavaFx также не позволяет этого. Есть ли какой-либо компонент, где я могу иметь часть текста, выделенного полужирным шрифтом?

Я не уверен, что JavaFx WebView - хорошая идея для рендеринга множества небольших предложений в окне.

4b9b3361

Ответ 1

Можно использовать контейнер TextFlow из JavaFX8. Затем вы можете легко добавить в него по-разному стилизованные узлы Text.

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);

Контейнер TextFlow автоматически переносит содержимое Текстовые узлы.

enter image description here

Ответ 2

Обновление: JavaFX 8 предоставляет новый элемент управления для расширенного текста: TextFlow


К сожалению, такой функции нет в 2.2, хотя она может быть включена в следующий выпуск.

Теперь вы можете попробовать использовать следующие подходы:

  • HBox с несколькими компонентами Label или Text
  • WebView
  • Холст с несколькими составленными текстовыми компонентами

Ответ 3

Поскольку предыдущие ответы не включали код FXML, я отправлю еще один.

Как было предложено @Ernisto, вы можете использовать TextFlow, который содержит Text, где каждая часть может быть написана по-разному.

Пример содержимого файла 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>

Выход

введите описание изображения здесь

Ответ 4

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);
    }
}

вызов:

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