Swing JFreechart zoom x-achse neue Werte

MarioW1986

Bekanntes Mitglied
Hallo, ich habe ein JFreechart (XYSeriesCollection) welches mit meine Werte anzeigt. Darunter habe ich einen JSlider positioniert, der die gleiche Skallierung wie die x-Achse hat. Jetzt möchte ich mit der Maus in das Chart reinzoomen (Standardfunktion). Wie bekomme ich die neuen Werte der X-Achse, um damit meinen JSlider neu zu füllen?

Ich weiß nicht mal genau wonach ich suchen muss. Welcher Listener wird denn ausgeführt beim Zoomen?

Ein kleinens Beispiel würde weiterhelfen oder einfach ein Link wo ich das nachlesen kann.

Gruß
 
Mit dem reinzoomen wird letzten Endes der Wertebereich einer oder mehrerer Achsen geändert. Die Achsen reagieren darauf mit dem Abfeuern eines AxisChangeEvents. Diesen wiederum registriert der Plot und sendet seinerseits einen PlotChangeEvent usw.
Wenn du dieses Event abfangen willst, würde ich an den Plot eine PlotChangeListener hängen und jedesmal, wenn ein PlotChangeEvent abgesetzt wird, den Wertebereich der Achse abfragen. Dazu muss der PlotChangeListener eine Referenz auf die Achse haben (um den Wert abzufragen), und auf den JSlider (um den neuen Wert zu setzen).
 
Ich versuche mir das gerade zusammenzubauen. Leider stoße ich bereits beim Verständnis an ein Problem. Ich habe jetzt meinem Plot ein ChangeListener angehängt. In diesem setze ich die Werte in meinem Slider. in dem AxisChangeEvent lese ich die neuen Werte aus. aber dieser wird niemals aufgerufen. Sicherlich weil ich diesen Listener nirgendwo angehängt habe. Aber auch weil ich gar nicht weiß wo genau. MAch ich das dann an der xAchse oder an beiden Achsen?
 
Du kannst sowhl über den PlotChangeEvent als auch über den AxisChangeEvent an die Achse kommen, deren neuen Wertebereich du abfragen willst. Hier ein Beispiel:
Java:
public class XYPlotDemo {

    public static void main(String[] args) {
        XYPlot plot = new XYPlot(new DefaultXYDataset(), new NumberAxis("x"), new NumberAxis("y"), new XYLineAndShapeRenderer());
        plot.addChangeListener(new PlotChangeListener() {
            public void plotChanged(PlotChangeEvent pce) {
                Plot p = pce.getPlot();
                if (p instanceof XYPlot) {
                    XYPlot xyp = (XYPlot) p;
                    System.out.println("In plotChanged, range: " + xyp.getDomainAxis().getRange());
                }
            }
        });
        plot.getDomainAxis().addChangeListener(
                new AxisChangeListener() {
                    public void axisChanged(AxisChangeEvent ace) {
                        Axis a = ace.getAxis();
                        if (a instanceof ValueAxis) {
                            ValueAxis va = (ValueAxis) a;
                            System.out.println("In axisChanged, range: " + va.getRange());
                        }
                    }
                });

        JFrame frame = new JFrame();
        frame.getContentPane().add(new ChartPanel(new JFreeChart(plot)));
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}
 
Ok danke, wenn ich die neuen Werte aber jetzt nicht ausgeben möchte sondern setzen. Dann komme ich doch in eine Endlosschleife oder`nicht?
Weil so weit war ich zwischenzeitlich auch schon. Bin dann aber wieder gescheitert.
Hab jetzt mal deine Variante genommen:

@Override
public void plotChanged(PlotChangeEvent pl) {
int up, low;
Plot p = pl.getPlot();
if (p instanceof XYPlot) {
XYPlot xyp = (XYPlot) p;
up = (int) xyp.getDomainAxis().getRange().getUpperBound();
low = (int) xyp.getDomainAxis().getRange().getLowerBound();
setzeKomponenten.fPlot[0].getDomainAxis().setLowerBound(low);
setzeKomponenten.fPlot[0].getDomainAxis().setUpperBound(up);
}
}

Ergebnis ist wieder ein Stackoverflow. Für mich logischerweise weil ich nach dem auslesen die Werte neu setze und somit wieder in dieses event komme. Wie muss ich das denn sonst amchen?


AHHHH oh man schon gut. ICh hab mich grade gefragt warum ich die nochmal setzen will. ist ja alles schon gesetzt^^ sry, vergiss diese Frage einfach.
 
Zuletzt bearbeitet:

Zurück
Oben