JavaFX:在CSS设置字体后,无法以编程方式设置字体大小

时间:2012-09-08 19:56:59

标签: css font-face javafx javafx-2

我已将应用程序的默认字体类型和大小存储在我使用代码应用的CSS文件中:

label.getStyleClass().add("labelStyleClass");

但是我还添加了一项功能,即如果用户提供自己的首选项,它应该覆盖默认设置(上面设置)并使用用户提供的字体大小:

double userSize = readFromFile;
label.setFont(new Font(userSize));

在这种情况下,label.setFont()调用不会设置用户给出的新大小。当我注释掉最初的CSS代码时,后者会工作。

任何解决方法?

注意:在JavaFX forum

交叉发布

1 个答案:

答案 0 :(得分:9)

这是设计的。出于架构原因,css的覆盖链如下:

  

默认caspian.css< API设置<用户的Scene css<用户的Parent css< setStyle()

或者,引用css reference guide

  

JavaFX CSS实现应用以下优先顺序;来自用户代理样式表的样式的优先级低于从代码设置的值,该代码的优先级低于场景或父样式表。内联样式具有最高优先级。来自Parent实例的样式表被认为比Scene样式表中的样式更具体。

因此,您可以使用setStyle()代替API调用来实现目标。尝试运行下一个示例:

public void start(Stage stage) {
    VBox root = new VBox(10);

    Scene scene = new Scene(root, 300, 250);
    // font.css: .labelStyleClass { -fx-font-size: 20 }
    scene.getStylesheets().add(getClass().getResource("font.css").toExternalForm());

    root.getChildren().add(LabelBuilder.create().text("default").build());
    root.getChildren().add(LabelBuilder.create().text("font-css").styleClass("labelStyleClass").build());

    Label lblApi = LabelBuilder.create().text("font-css-api (doesn't work)").styleClass("labelStyleClass").build();
    lblApi.setFont(Font.font(lblApi.getFont().getFamily(), 40));
    root.getChildren().add(lblApi);

    Label lblStyle = LabelBuilder.create().text("font-css-setstyle (work)").styleClass("labelStyleClass").build();
    lblStyle.setStyle("-fx-font-size:40;");
    root.getChildren().add(lblStyle);

    stage.setTitle("Hello World!");
    stage.setScene(scene);
    stage.show();
}