JavaFX中Font#font方法的字体大小实际单位确认
JavaFX中Font#font方法的字体大小实际单位确认
你这个发现太关键了!Javadoc的描述和实际行为的不一致确实很容易让人懵,但你的测试代码把问题展现得明明白白。
先来看你贴的Font#font方法的Javadoc片段:
/** * Searches for an appropriate font based on the font family name and size... * * @param family The family of the font * @param size {@literal The point size of the font. This can be a fractional value, * but must not be negative. If the size is < 0 the default size will be * used.} * @return The font that best fits the specified requirements. */ public static Font font(String family, double size) { return font(family, null, null, size); }
Javadoc明确标注size参数是“点(pt)”,但实际测试下来完全不是这么回事——你的测试代码就是最好的证明:
public class TestFx extends Application { @Override public void start(Stage primaryStage) { var label1 = new Label("Hello, World!"); label1.setFont(Font.font("System", 40)); HBox box1 = new HBox(label1); box1.setStyle("-fx-background-color: yellow"); var label2 = new Label("Hello, World!"); label2.setStyle("-fx-font-size: 40pt; -fx-font-family: 'System'"); HBox box2 = new HBox(label2); box2.setStyle("-fx-background-color: red"); var box = new HBox(box1, box2); VBox root = new VBox(box); root.setPadding(new Insets(20)); Scene scene = new Scene(root, 600, 150); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
从你的测试结果能清楚看到:
- 用
Font.font("System", 40)设置的label1,字体大小远小于用CSS-fx-font-size:40pt设置的label2; - 但当你把label2的CSS改成
-fx-font-size:40px后,两个标签的字体大小就完全一致了。
这就可以确定一个核心结论:Font#font方法的size参数,实际对应的是JavaFX CSS中的像素(px)单位,而非Javadoc描述的点(pt)。
这个差异的根源在于JavaFX的默认DPI假设(96DPI),在这个前提下,1pt = 96/72 px ≈1.333px,所以40pt换算后约为53.33px,这也是为什么label2用40pt时字体更大。而Font#font的size参数直接映射到像素单位,这才导致了Javadoc和实际表现的偏差——不得不说,这个Javadoc的描述确实不够精准。
内容来源于stack exchange
相关产品推荐
相关产品推荐

