Не простой вариант, чтобы включить inverse()
операцию по осям. Без исправления классов JRE это довольно сложно.
Некоторые советы о том, как подойти к этому:
1) расширить ValueAxis или оси (NumberAxis является окончательным, к сожалению)
2) добавить логическое поле и inverse()
метод к классу оси
public void inverse() {
inversed = !inversed; // boolean property
invalidateRange();
requestAxisLayout();
}
3) если вы увеличиваете ValueAxis - вам нужно будет компенсировать смещение, применяемое суперклассом (и перехватить код, где изменяется размер оси)
@Override
public Long getValueForDisplay(double displayPosition) {
if (inversed)
return super.getValueForDisplay(offset - displayPosition);
else
return super.getValueForDisplay(displayPosition);
}
@Override
public double getDisplayPosition(Long value) {
if (inversed)
return offset - super.getDisplayPosition(value);
else
return super.getDisplayPosition(value);
}
4) (самая уродливая часть), спрятанные этикетки, подавленные классом Axis - исходная реализация зависит от порядка тиков по умолчанию. Я не нашел другого способа, который мог бы разблокировать его через отражение. Так что это очень хрупкое.
@Override
protected void layoutChildren() {
final Side side = getSide();
boolean isHorisontal = null == side || side.isHorizontal();
this.offset = isHorisontal ? getWidth() : getHeight();
super.layoutChildren();
if (inversed) {
double prevEnd = isHorisontal ? offset + getTickLabelGap() : 0;
for (TickMark m : getTickMarks()) {
double position = m.getPosition();
try {
final Text textNode = (Text) textNodeField.get(m);
final Bounds bounds = textNode.getLayoutBounds();
if (0 <= position && position <= offset)
if (isHorisontal) {
textNode.setVisible(position < prevEnd);
prevEnd = position - (bounds.getWidth() + getTickLabelGap());
} else {
textNode.setVisible(position > prevEnd);
prevEnd = position + (bounds.getHeight() + getTickLabelGap());
}
} catch (IllegalAccessException ignored) {
}
}
}
}
Ось Y инвертируется в этом примере
Вы предлагаете преобразовать все мои данные в отрицательные числа, прежде чем использовать их в диаграммах? – mawcsco
есть. Разумеется, это не лучший способ, но гораздо быстрее, чем расширение графика с функциями инверсии. Чтобы избежать прямого обновления данных, вы можете либо расширить класс XYChart.Data' с помощью логики инверсии, либо ввести метод утилиты, который добавит инвертированные числа в диаграмму. –