JavaFX FXML中通过style属性设置Slider刻度字体失效问题
问题根因
你的判断是对的。Slider的刻度文字不是Slider自身渲染的,是它皮肤类内部创建的名为axis的NumberAxis子节点负责绘制,这个内部节点默认不会继承Slider根节点上直接设置的字体样式——其余控件没有这种未做样式继承的嵌套内部结构,所以直接给控件加-fx-font-family就能生效,只有Slider的刻度标签不生效。
另外你贴的FXML里有个笔误:xmlns:fx="http:/javafx.com/xml" 少了斜杠也写错了fxml路径,正确写法是xmlns:fx="http://javafx.com/fxml",部分JavaFX版本下这个错误会导致FXML加载失败。
问题表现参考截图:
解决方法
两种方案都可以,按需选择即可:
方案1:外部CSS统一配置(最推荐,维护成本最低)
不用改原有FXML结构,单独写CSS规则命中Slider内部的axis节点即可。
- 在资源目录下新建样式文件,比如命名为
control.css,写入以下规则:
/* 匹配所有Slider的内部刻度轴节点 */ .slider .axis { -fx-font-family: 'PingFang SC'; /* 要调整刻度字号、颜色也可以在这里加配置,比如: -fx-font-size: 12px; -fx-tick-label-fill: #333333; */ }
- 在启动类里给Scene加载这个样式表,修改
HelloApplication.java的start方法:
@Override public void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml")); Scene scene = new Scene(fxmlLoader.load(), 800, 500); // 加载自定义样式 scene.getStylesheets().add(HelloApplication.class.getResource("control.css").toExternalForm()); stage.setTitle("Hello!"); stage.setScene(scene); stage.show(); }
运行后所有Slider的刻度字体都会正常应用苹方字体。
方案2:FXML内嵌样式(无需单独CSS文件)
如果不想额外加样式文件,直接在Slider的style属性里写嵌套CSS规则即可,JavaFX支持在内联样式中写子节点选择器,把原有FXML里的Slider标签替换成以下内容即可:
<Slider GridPane.rowIndex="3" GridPane.columnIndex="0" showTickLabels="true" showTickMarks="true" GridPane.columnSpan="3" minorTickCount="4" snapToTicks="true" style="-fx-font-family: 'PingFang SC'; .axis {-fx-font-family: 'PingFang SC';}"/>
- 不推荐在控制器里用
lookup方法拿axis节点再手动设字体,这种方式依赖组件完成皮肤渲染的时机,容易出现空指针或者偶发不生效的问题。
内容的提问来源于stack exchange,提问作者rui wang
相关产品推荐
相关产品推荐

