javafx - JavaFX - 如何使轴刻度线标签居中
问题描述
想要为 JavaFX 图表的 x 轴刻度标签设置text-alingment
为。center
我有一个带日期的 JavaFX NumberAxis X 轴,使用多行文本作为刻度标签。使用 . 将刻度标签设置为 "dd/MMM\YYYY" 或 "HH:mm\ndd/MMM AxisX.setTickLabelFormatter(getTimeAxisString())
" 用户函数 getTimeAxisString() 为刻度标签提供格式化字符串。默认情况下,这会导致文本左对齐,如下图所示:
轴刻度标签
是否有 JavaFx 方法来更改此处的文本?我可以为刻度标签分配一个 CSS 类吗?
解决方案
令人惊讶的是,不直接支持标记标签的样式。此外,所有图表和协作者都非常注意不要在任何 api 中暴露其层次结构中的节点(甚至在内部也不公开)。所以看起来我们需要依赖 Axis 的实现细节..
- 封装标签状态的类是 TickMark
- 它有一个字符串类型的字段,命名为标签:这是值的字符串表示形式,可通过转换器值 -> 字符串进行配置
- 它有一个 Text 类型的字段,名为 textNode:这是添加到 Axis 的节点和我们要设置样式的节点
- 文本本身没有默认样式类,无法通过
axis.lookup(style)
- textNode 没有可能由其父轴设置的默认自定义样式(与轴标签相反)
基本任务是通过直接配置其属性或设置自定义样式类并通过 css 配置来访问文本然后对其进行样式设置。
基本的解决路径是监听axis children,添加时配置所有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");
}
}
}
}
});
示例样式:
.axis-tick-mark-text-node {
-fx-text-alignment: center;
-fx-fill: red;
}
推荐阅读
- python - 为什么 jaccard_score 和 jaccard_similarity_score 的输出不同?
- algorithm - 如何从三个排序的 A、B、C 中找到三元组 { x 、 y 、 z },使得 x < y < z 在 O(n) 中?
- spring-integration - Spring IntegrationFlow 用于多租户应用程序或多个要观看的文件夹
- c - 在自己的 malloc 函数中调用 printf 导致分段错误
- android-studio - 在 android studio 中创建一个类似于 WhatsApp 弹出通知的弹出窗口
- php - 如何让 yii 1 post 方法与邮递员一起工作
- javascript - React js 有条件地将类渲染到特定的映射项
- python - 如何从文本文件中删除元素末尾的分号到列表
- algorithm - 在网格排序算法中,行排序和列排序步骤是交错的。[修改剪切排序]
- javascript - 成功条带结帐后调用端点