【发布时间】:2018-09-02 21:56:32
【问题描述】:
我有一个显示市场指标的 LineChart,例如:
如您所见,使用这种指标的有趣之处在于指标高于或低于阈值线。
我想完全按照上图所示进行操作:在给定值(中间、上限、下限)的 Y 轴上只有刻度。
有可能吗?
【问题讨论】:
-
实现自定义轴...
标签: javafx
我有一个显示市场指标的 LineChart,例如:
如您所见,使用这种指标的有趣之处在于指标高于或低于阈值线。
我想完全按照上图所示进行操作:在给定值(中间、上限、下限)的 Y 轴上只有刻度。
有可能吗?
【问题讨论】:
标签: javafx
根据 cmets 中的@kleopatra 建议,我实现了自己的 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 是 final,所以我不能继承它。
我不想复制/粘贴 NumberAxis 的内容,但我不能为受保护的方法使用委托,所以除了复制/粘贴之外我没有找到任何其他方法...
但它可以工作,使用:
FixedTicksAxis yAxis = new FixedTicksAxis(30, 50, 70);
我们得到:
【讨论】: