JavaFX:标签与文本布局的区别

JavaFX:标签与文本布局的区别,javafx,text,label,javafx-8,Javafx,Text,Label,Javafx 8,我遇到了一个奇怪的问题,当工作与标签和文字的结合。在简单场景下,如果我为具有相同样式的标签节点和文本节点提供一个字符串,它们的渲染方式是否不同?就我而言,它正在发生。我不明白为什么它会以这种方式实施 例如,对于给定的代码: Text text = new Text("Hello"); text.getStyleClass("myText"); Label label = new Label("Hello"); label.getStyleClass("myText"); 和css代码: .m

我遇到了一个奇怪的问题,当工作与标签和文字的结合。在简单场景下,如果我为具有相同样式的标签节点和文本节点提供一个字符串,它们的渲染方式是否不同?就我而言,它正在发生。我不明白为什么它会以这种方式实施

例如,对于给定的代码:

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:(先文本,然后标签)

文本边界小于标签的文本节点边界

案例#2:(先标签,然后文本)

文本边界与标签的文本节点边界相同

因此,简而言之,一旦渲染标签,所有文本节点(相同的字符串和样式)的下一次渲染将具有与标签相同的大小

演示:

为了更好地理解,如果查看下面的演示,第一个文本节点的边界与第二个文本节点的边界不同(因为标签是在第二个文本节点之前呈现的)

而labeltext.css代码是:

.myText, .myText .text{
   -fx-font-family:"Verdana";
    -fx-font-size:18px;
 }
深入研究JavaFX代码后,我们注意到,PrismTextLayout.java使用缓存获取已渲染文本的边界(对于相同的字符串和样式)。我相信这有利于提高绩效。但我并不期望得到不同的结果(在我的例子中,文本节点的边界不同)


这是JavaFX中的一个bug还是我遗漏了什么?

听起来像是个bug
hBox.getChildren().add(label,text);
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();
    }
}
.myText, .myText .text{
   -fx-font-family:"Verdana";
    -fx-font-size:18px;
 }