Nie łatwym rozwiązaniem jest umożliwienie inverse()
operację na osiach. Bez łatania klas JRE jest to dość skomplikowane.
Kilka wskazówek, w jaki sposób podejść do tego:
1) przedłużyć ValueAxis lub Axis (NumberAxis jest ostateczna niestety)
2) dodać pole logiczną i inverse()
metody do klasy osi
public void inverse() {
inversed = !inversed; // boolean property
invalidateRange();
requestAxisLayout();
}
3) jeśli rozszerzysz ValueAxis - będziesz musiał skompensować przesunięcie zastosowane przez nadklasę (i przechwycić kod, w którym zmienia się rozmiar osi)
@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) (najbrzydszy kawałek) odznacz ukryte znaczniki stłumione przez klasę Osi - oryginalna implementacja zależy od domyślnej kolejności znaczników. Nie znalazłem żadnego innego sposobu, który odblokowałby poprzez odbicie. Jest to bardzo kruche.
@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) {
}
}
}
}
Oś Y jest odwrócony w tym przykładzie
Sugerujesz, że przekonwertuję wszystkie moje dane na liczby ujemne przed użyciem ich na wykresach? – mawcsco
tak. Nie jest to najlepszy sposób, ale znacznie szybszy niż rozszerzanie wykresu o funkcję inwersji. Aby uniknąć bezpośredniej aktualizacji danych, możesz rozszerzyć klasę 'XYChart.Data' o logikę inwersji lub wprowadzić metodę narzędzia, która doda do wykresu odwrócone liczby. –