Я сталкиваюсь со странной проблемой при работе с надписью и текстом в сочетании. В простом сценарии, если я предоставлю строку для узлов 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](https://i.stack.imgur.com/CAnsO.png)
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 или я что-то упустил?