JavaFX - 如何使轴刻度线标签居中

0 charts axis javafx

想要将 JavaFX 图表的 x 轴刻度标签设置text-alingment为。center

我有一个带有日期的 JavaFX NumberAxis X 轴,使用多行文本作为刻度标签。使用 . 将刻度标签设置为“dd/MMM\YYYY”或“HH:mm\ndd/MMM” AxisX.setTickLabelFormatter(getTimeAxisString())。用户函数 getTimeAxisString() 提供刻度标签的格式化字符串。默认情况下,这会导致文本左对齐,如下图所示: 轴刻度标签

是否有 JavaFx 方法可以更改此处的文本排列?我可以为刻度标签分配 CSS 类吗?

kle*_*tra 5

令人惊讶的是,不直接支持对刻度标签进行样式设置。另外,所有图表和协作者都非常小心,不要任何 api 中暴露其层次结构中的节点(甚至在内部)。所以看起来我们需要依赖 Axis 的实现细节..

  • 封装刻度标签状态的类是 TickMark
  • 它有一个 String 类型的字段,名为 label:这是值的字符串表示形式,可通过转换器进行配置 value -> String
  • 它有一个 Text 类型的字段,名为 textNode:这是添加到 Axis 的节点,也是我们想要设置样式的节点
  • 文本本身没有默认样式类,无法通过以下方式访问axis.lookup(style)
  • textNode 没有可能由其父轴设置的默认自定义样式(与轴标签相反)

基本任务是访问文本并设置其样式,方法是直接配置其属性或设置自定义样式类并通过 css 配置它。

基本的解决方案路径是监听轴子节点并在添加时配置所有 Text 类型节点的属性。下面的代码片段设置了一个自定义样式类。

xAxis.getChildrenUnmodifiable().addListener((ListChangeListener<Node>) c -> {
    while (c.next()) {
        if (c.wasAdded()) {
            for (Node mark : c.getAddedSubList()) {
                if (mark instanceof Text) {
                    mark.getStyleClass().add("axis-tick-mark-text-node");
                }
            }
            
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

样式示例:

.axis-tick-mark-text-node {
    -fx-text-alignment: center;
    -fx-fill: red;
}
    
Run Code Online (Sandbox Code Playgroud)