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