我需要移动轴上所有刻度线的标签(Text
),使得文本位于其自己的刻度线和下一个刻度线的中间。
我正在使用Roland的GanttChart控件(经过一些修改)和Christian Schudt的DateAxis作为我的X轴。我的目标是根据日期值绘制甘特图(忽略时间;所有时间值都被截断)。
我的甘特图有一个"开始日期"和#34;结束日期"对于每一项任务(即在图表上可视化,它由单个条形图表示)。
考虑一下:
我的任务从2月1日开始,并在同一天(2月1日)结束。我有两种方法在图表上呈现这一点:
为了解决方法2引起的问题,我需要将文本标签向右移动半个刻度标记宽度。这样做会使用户非常清楚。
我试过这样做:
final DateAxis xAxis = (DateAxis) this.ganttchart.getXAxis();
xAxis.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>()
{
@Override
public void onChanged(javafx.collections.ListChangeListener.Change<? extends Node> c)
{
final List<Node> labels = xAxis.getChildrenUnmodifiable().filtered(node -> node instanceof Text);
for (Node label : labels)
{
label.setTranslateX(xAxis.getWidth() / (labels.size() - 1) / 2);
}
}
});
但是,这样做似乎并没有将Text
标签向右移动。
答案 0 :(得分:0)
我尝试过的方法确实有效,但我遇到了种族问题。如果我使用Platform.runLater()
,它会正确移位。但是,每当我调整图表大小时,位置都会闪烁(它会在原始位置和移位位置之间跳转)。
这是完整的工作版本,我需要覆盖layoutChildren()
中的DateAxis
。
@Override
protected void layoutChildren()
{
if (!isAutoRanging())
{
currentLowerBound.set(getLowerBound().getTime());
currentUpperBound.set(getUpperBound().getTime());
}
super.layoutChildren();
/*
* Newly added codes.
*/
final List<Node> labels = this.getChildrenUnmodifiable().filtered(node -> node instanceof Text);
for (Node label : labels)
{
if (this.getSide() == Side.LEFT || this.getSide() == Side.RIGHT)
label.setTranslateY(this.getHeight() / (labels.size() - 1) / 2);
else if (this.getSide() == Side.TOP || this.getSide() == Side.BOTTOM)
label.setTranslateX(this.getWidth() / (labels.size() - 1) / 2);
}
/*
* End of new codes.
*/
}
还有一些布局错误。这与Axis.positionTextNode()
使用getBoundsInParent()
定位文本的事实有关,这需要考虑翻译。
这是新的工作版本,希望有一天会对某人有所帮助。
@Override
protected void layoutChildren()
{
if (!isAutoRanging())
{
currentLowerBound.set(getLowerBound().getTime());
currentUpperBound.set(getUpperBound().getTime());
}
super.layoutChildren();
/*
* Newly added codes.
*/
final List<Node> labels = this.getChildrenUnmodifiable().filtered(node -> node instanceof Text);
for (Node label : labels)
{
if (this.getSide().isHorizontal())
{
if (label.getTranslateX() == 0)
label.setTranslateX(this.getWidth() / (labels.size() - 1) / 2);
else
{
label.setLayoutX(label.getLayoutX() + label.getTranslateX());
}
}
else if (this.getSide().isVertical())
{
if (label.getTranslateY() == 0)
label.setTranslateY(this.getHeight() / (labels.size() - 1) / 2);
else
{
label.setLayoutY(label.getLayoutY() + label.getTranslateY());
}
}
}
/*
* End of new codes.
*/
}