我需要在轴上移动所有tick标记的标签( Text
(,以使文本在其自己的tick标记和下一个tick标记的中间。
我正在使用Roland的Ganttchart控制(一些修改(,而Christian Schudt的Dateaxis则用于我的X轴。我的目的是根据日期值绘制甘特图(忽略时间;所有时间值都被截断(。
我的甘特图具有每个任务的"开始日期"和一个"结束日期"(即,在图表上以单个栏表示(。
考虑一下:
我从2月1日开始有一个任务,并在同一天(2月1日(结束。我有两种在图表上渲染的方法:
- 将其从2月1日开始,并于2月1日结束。该条有效地隐藏了,因为其宽度为0。
- 将其从2月1日开始渲染,bar的右边触摸 2月2日。这可能会使用户感到困惑,因为它看起来像从2月1日开始并于2月2日结束。
要解决方法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
标签移到右边。
我尝试过的方法实际上有效,但是我在种族状况方面有问题。如果我使用Platform.runLater()
,它将正确移动。但是,每当我调整图表的大小时,位置会闪烁(它将在原始位置和移位位置之间跳跃(。
这是完整的工作版本,我需要在DateAxis
中覆盖layoutChildren()
。
@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.
*/
}