JavaFX: Различия в метках и макете текста - PullRequest
3 голосов
/ 02 марта 2020

Я сталкиваюсь со странной проблемой при работе с надписью и текстом в сочетании. В простом сценарии, если я предоставлю строку для узлов Label и Text с одинаковым стилем, они будут отображаться по-разному? В моем случае это происходит. И я не могу понять, почему это реализовано таким образом.

Например, для данного кода:

Text text = new Text("Hello");
text.getStyleClass("myText");

Label label = new Label("Hello");
label.getStyleClass("myText");

и кода css:

.myText, .myText .text{
   -fx-font-family:"Verdana";
   -fx-font-size:18px;
}

Если я отображаю узлы метки и текста в макете (скажем, HBox):

Случай №1: (сначала текст, а затем метка)

hBox.getChildren().add(text,label);

Границы text меньше границ текстового узла метки .

Case # 2: (сначала метка, а затем текст)

hBox.getChildren().add(label,text);

Границы text совпадают с границами текстовых узлов метки .

Таким образом, как только метка будет отображена, следующий рендеринг всех текстовых узлов (той же строки и стиля) будет иметь тот же размер, что и Label.

Демонстрация:

Для лучшего понимания, если вы проверите ниже демонстрации границы первого текстового узла отличаются от границ второго текстового узла (поскольку метка отображается перед вторым текстовым узлом).

enter image description here

import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;


public class LabelVsText_Demo extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    Text labelTextNode;

    @Override
    public void start(Stage primaryStage) {
        GridPane root = new GridPane();
        root.setHgap(10);
        root.setVgap(10);
        root.setPadding(new Insets(10));

        Text txt1Text = new Text("Text 1:");
        Text labelText = new Text("Label:");
        Text txt2Text = new Text("Text 2:");

        Text text1 = new Text("AF421");
        text1.getStyleClass().add("myText");

        Label label = new Label("AF421");
        label.getStyleClass().add("myText");
        label.getChildrenUnmodifiable().addListener(
                (InvalidationListener) p -> label.getChildrenUnmodifiable().forEach(node -> labelTextNode = (Text) node));

        Text text2 = new Text("AF421");
        text2.getStyleClass().add("myText");

        Text b1 = new Text();
        Text b2 = new Text();
        Text b3 = new Text();

        Button button = new Button("Show Bounds");
        button.setOnAction(e -> {
            b1.setText(text1.getLayoutBounds().toString());
            b2.setText(labelTextNode.getLayoutBounds().toString());
            b3.setText(text2.getLayoutBounds().toString());
        });

        root.addRow(0, txt1Text, text1, b1);
        root.addRow(1, labelText, label, b2);
        root.addRow(2, txt2Text, text2, b3);
        root.add(button, 0, 3, 3, 1);

        Scene scene = new Scene(root, 1200, 400);
        scene.getStylesheets().add(LabelVsText_Demo.class.getResource("labeltext.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

и лейбл xt. css код:

.myText, .myText .text{
   -fx-font-family:"Verdana";
    -fx-font-size:18px;
 }

При углубленном изучении кода JavaFX замечено, что PrismTextLayout. java использует кэш для получения границ уже отрендеренных Текст (для той же строки и стиля). Я считаю, что это хорошо для повышения производительности. Но я не ожидаю других результатов (в моем случае, разные границы для узла Text)

Это ошибка в JavaFX или я что-то упустил?

...