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

标签 css javafx label stylesheet

如果文本不完全适合标签的边界,我需要自动调整 JavaFX 标签上的字体大小。我在网上找到了一些很棒的代码(此处为 Resize JavaFX Label if overrun)来执行此操作,但问题是代码将字体大小作为参数。看起来确定字体大小非常容易,但 Label.getFont() 返回默认设置,因为我的应用程序正在使用 css 设置字体大小。我的 css 将字体大小设置为 30,但到目前为止我想出如何在标签上查找的所有内容都返回默认设置 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,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() 获取磅值。)

关于css - 如何在JavaFX Label上查找应用的字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024440/

相关文章:

java - 什么时候可以访问 FXML 属性?

当使用 fxml 作为 fxml 中的组件时,JavaFX FXML 没有正确地看到我的 Controller 方法 "Controller is not defined on root component"

html - 将表单字段放在标签标签内是好主意还是坏主意?

r - 设置网格中轴标签的格式

label - 使用JIRA标签

javascript - jQuery根据表单输入的值改变段落跨度标签的文本

css - 如何在 Actionscript 3 中粘贴具有相同属性的文本?

javascript - d3力布局中心节点定位

python - 更改 iPython 笔记本 Markdown 单元格中的字体

java - 全屏应用程序中的警报问题