【问题标题】:How to lookup the applied font on JavaFX Label?如何在 JavaFX 标签上查找应用的字体?
【发布时间】:2016-12-25 18:04:12
【问题描述】:

如果文本不完全适合标签的边界,我需要自动调整 JavaFX 标签上的字体大小。我在网上找到了一些很棒的代码(这里Resize JavaFX Label if overrun)来做到这一点,但问题是代码需要字体大小和作为参数。确定字体大小似乎很容易,但 Label.getFont() 返回默认设置,因为我的应用程序使用 css 来设置字体大小。我的 css 将字体大小设置为 30,但到目前为止,我已经弄清楚如何在 Label 上查找的所有内容都返回默认设置 12。

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

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

._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);
}

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

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

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

那么这个属性在哪里被应用,我该如何查找呢?似乎应该很容易找出这些信息,但我找不到。使用后设置字体非常容易:

 Label.setStyle("-fx-font-size: " + fontSize + "px");

非常感谢任何帮助。

【问题讨论】:

    标签: css javafx label stylesheet


    【解决方案1】:

    标签的场景(或父级)加载样式表并应用 CSS 后,getFont() 将返回 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() 获取磅值。)

    【讨论】:

    • 啊!我错过了 applyCss 功能。一旦我调用它,现在字体返回 30 的大小。我知道这很简单......谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多