我已将应用程序的默认字体类型和大小存储在我使用代码应用的CSS文件中:
label.getStyleClass().add("labelStyleClass");
但是我还添加了一项功能,即如果用户提供自己的首选项,它应该覆盖默认设置(上面设置)并使用用户提供的字体大小:
double userSize = readFromFile;
label.setFont(new Font(userSize));
在这种情况下,label.setFont()
调用不会设置用户给出的新大小。当我注释掉最初的CSS代码时,后者会工作。
任何解决方法?
注意:在JavaFX forum
交叉发布答案 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();
}