如何在JavaFX Label上查找应用的字体?

How to lookup the applied font on JavaFX Label?

如果文本不完全适合标签的边界,我需要自动调整 JavaFX 标签上的字体大小。我在网上找到了一些很棒的代码(这里 )来执行此操作,但问题是代码将字体大小作为参数。看起来确定字体大小很容易,但是 Label.getFont() returns 默认设置,因为我的应用程序使用 css 设置字体大小。我的 css 将字体大小设置为 30,但到目前为止,我想出如何在标签上查找的所有内容都返回默认设置 12。

所以我尝试查找它,但我不知道在哪里可以找到它。 Label.getStyle() returns 空字符串。 getCSSMetaData() returns 一大堆有趣的设置,我能够在那里找到字体并查看子属性,但它再次存储字体大小 12 和不同样式名称的默认值。

这是我正在使用的样式 sheet 文件中的设置,因此我知道我需要找到反馈卡和字体大小:

._Feedback_Card {
-fx-font-size: 30px;
-fx-font-weight: bold;
-fx-text-fill: rgba(0,0,0,.9);
-fx-background-color: white;
-fx-border-color: white;
-fx-border-width: 0;
-fx-alignment: center;
-fx-text-alignment: center;
-fx-font-family: Arial Unicode MS;
-fx-effect: dropshadow(gaussian, #b4b4b4, 6,0,0,2);
}

不要被名称所左右,代码中的其他地方有一个映射以某种方式将此组件映射到那个 class 名称。它是由同事编写的,所以我不知道确切的机制。但是鉴于该名称,我尝试使用以下命令查找根节点上的区域:

Region node =     (Region)jsLayoutCollection.jsDisplayLayoutCollection.fGetFXParent().lookup("._Feedback_Card");
String sStream = node.getCssMetaData().stream()

然后我查看了流中的字体属性。但这再次返回字体,但大小是默认的 12,而不是样式 sheet 将其设置为的 30。

那么这个 属性 应用在哪里?我该如何查找它?弄清楚这些信息似乎应该很简单,但我找不到。在with:

之后设置字体非常容易
 Label.setStyle("-fx-font-size: " + fontSize + "px");

非常感谢任何帮助。

一旦标签的场景(或父级)加载了样式表,并且应用了 CSS,getFont() 将 return 由 CSS 设置的字体.

此代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class GetCSSFont extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Big label");
        StackPane root = new StackPane(label);
        Scene scene = new Scene(root);
        scene.getStylesheets().add("set-font.css");

        System.out.println("Default font: "+label.getFont());

        label.applyCss();

        System.out.println("Font from CSS: "+label.getFont());

        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

set-font.css:

.label {
    /* Note the font family needs quoting if it has spaces: */
    -fx-font-family: 'Arial Unicode MS' ;
    -fx-font-size: 30px ;
    -fx-font-weight: bold ;
}

.root {
    -fx-padding: 20 ;
}

产生输出:

Default font: Font[name=System Regular, family=System, style=Regular, size=13.0]
Font from CSS: Font[name=Arial Unicode MS, family=Arial Unicode MS, style=Regular, size=30.0]

(当然,您可以使用 double size = label.getFont().getSize() 获取磅值。)