JavaFX:将轴的刻度标签定位在刻度线中间



我需要在轴上移动所有tick标记的标签( Text(,以使文本在其自己的tick标记和下一个tick标记的中间。

我正在使用Roland的Ganttchart控制(一些修改(,而Christian Schudt的Dateaxis则用于我的X轴。我的目的是根据日期值绘制甘特图(忽略时间;所有时间值都被截断(。

我的甘特图具有每个任务的"开始日期"和一个"结束日期"(即,在图表上以单个栏表示(。

考虑一下:

我从2月1日开始有一个任务,并在同一天(2月1日(结束。我有两种在图表上渲染的方法:

  1. 将其从2月1日开始,并于2月1日结束。该条有效地隐藏了,因为其宽度为0。
  2. 将其从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.
     */
}

最新更新