JavaFX手动设置NumberAxis刻度 [英] JavaFX manually set NumberAxis ticks

查看:46
本文介绍了JavaFX手动设置NumberAxis刻度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个LineChart,它显示诸如此类的市场指标:

I have a LineChart that displays a market indicator such as this one:

如您所见,使用这种指标的有趣之处在于指标高于或低于阈值线.

As you see, what is interesting when using this kind of indicator is when the indicator is above or below threshold lines.

我想完全按照上图所示进行操作:YAxis上的刻度线只有给定值(中间,上限,下限).

I want to do exactly as shown on the picture above: only have ticks on the YAxis at given values (middle, upper limit, lower limit).

有可能吗?

推荐答案

在注释中使用@kleopatra建议后,我实现了自己的NumberAxis:

Following @kleopatra advice in the comments, I implemented my own NumberAxis:

public class FixedTicksAxis extends ValueAxis<Number> {

    // List of ticks
    private final List<Number> ticks;

    // Formatter
    private NumberAxis.DefaultFormatter defaultFormatter;

    public FixedTicksAxis(Number... ticks) {
        super();

        this.ticks = Arrays.asList(ticks);
        this.defaultFormatter = new NumberAxis.DefaultFormatter(new NumberAxis());
    }

    @Override
    protected List<Number> calculateMinorTickMarks() {
        return new ArrayList<>();
    }

    @Override
    protected void setRange(Object range, boolean animate) {
        final double[] rangeProps = (double[]) range;
        final double lowerBound = rangeProps[0];
        final double upperBound = rangeProps[1];
        final double scale = rangeProps[2];
        setLowerBound(lowerBound);
        setUpperBound(upperBound);

        currentLowerBound.set(lowerBound);
        setScale(scale);
    }

    @Override
    protected Object getRange() {
        return new double[]{
                getLowerBound(),
                getUpperBound(),
                getScale(),
        };
    }

    @Override
    protected List<Number> calculateTickValues(double length, Object range) {
        return ticks;
    }

    @Override
    protected String getTickMarkLabel(Number value) {
        StringConverter<Number> formatter = getTickLabelFormatter();
        if (formatter == null) formatter = defaultFormatter;
        return formatter.toString(value);
    }
}

NumberAxis是最终的,所以我不能对其进行子类化.

NumberAxis is final, so I can't subclass it.

我不想复制/粘贴NumberAxis的内容,但是我不能将委托用于受保护的方法,因此除了复制/粘贴外,我找不到其他方法...

I didn't want to copy/paste the content of NumberAxis, but I cannot use a delegate for the protected methods, so I did not find any other way than copy/pasting...

但是它可以使用:

 FixedTicksAxis yAxis = new FixedTicksAxis(30, 50, 70);

我们得到:

这篇关于JavaFX手动设置NumberAxis刻度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆