Non facile opzione è quella di consentire il funzionamento inverse()
su assi. Senza applicare patch alle classi JRE è piuttosto complicato.
alcuni suggerimenti su come avvicinarsi a questo:
1) estendere ValueAxis o asse (NumberAxis è definitiva purtroppo)
2) aggiungere campo booleano e inverse()
metodo per la classe all'asse
public void inverse() {
inversed = !inversed; // boolean property
invalidateRange();
requestAxisLayout();
}
3) se estendi ValueAxis - dovrai compensare l'offset applicato dalla superclasse (e intercettare il codice in cui cambia la dimensione dell'asse)
@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) (il pezzo più brutto) nasconde le tacche dell'etichetta soppresse dalla classe Axis - l'implementazione originale dipende dall'ordine predefinito di tick. Non ho trovato nessun altro modo che lo sblocchi tramite la riflessione. Quindi questo è molto fragile.
@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) {
}
}
}
}
asse Y è invertito in questo esempio
Stai suggerendo di convertire tutti i miei dati in numeri negativi prima di usarlo nei grafici? – mawcsco
si. Ovviamente non è il modo migliore, ma molto più veloce quindi estendere il grafico con funzionalità di inversione. Per evitare l'aggiornamento diretto dei dati, è possibile estendere la classe 'XYChart.Data' con la logica di inversione o introdurre un metodo di utilità che aggiunga numeri invertiti al grafico. –