2009-12-14 5 views
6

Wir verwenden JFreeChart, um XY-Plots zu erstellen, und wir haben eine Feature-Anforderung, um ein Fadenkreuz zu erstellen, das sich mit der Maus bewegt und den Datenpunkt markiert, der am ehesten dem x-Wert der Maus entspricht. Sie können ein ähnliches Beispiel bei Google Finanzen sehen - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC.Hat jemand Crosshairs gemacht, die der Maus in JFreeChart folgen?

Diese Google-Charts markieren nur den aktuellen Wert (wir wollen das und zeigen auch Fadenkreuze), aber sie zeigen die Live-Maus-Interaktion, nach der wir suchen.

Wer hat irgendwelche eleganten Vorschläge?

Danke.

Antwort

4

Ich habe dies funktioniert mit einem Maus-Listener und der CrosshairOverlay-Klasse. Nachdem ich von den Urlaubsreisen zurückgekommen bin, werde ich meinen Code posten. Es endete nicht zu schwierig.


Entschuldigung, ich habe das vergessen!

Zuerst möchten Sie die x, y-Werte für die Position Ihres Fadenkreuzes berechnen. Für mich wollte ich, dass es sich entlang der Punkte unserer Linie bewegt, also berechnete ich den nächsten x-Wert und verwendete dieses Datenpaar für x, y.

Dann rufe ich diese Methode:

protected void setCrosshairLocation(double x, Double y) { 
    Crosshair domainCrosshair; 
    List domainCrosshairs = crosshairOverlay.getDomainCrosshairs(); 
    if (domainCrosshairs.isEmpty()) { 
     domainCrosshair = new Crosshair(); 
     domainCrosshair.setPaint(BlueStripeColors.LIGHT_GRAY_C0); 
     crosshairOverlay.addDomainCrosshair(domainCrosshair); 
    } 
    else { 
     // We only have one at a time 
     domainCrosshair = (Crosshair) domainCrosshairs.get(0); 
    } 
    domainCrosshair.setValue(x); 

    if (y != null) { 
     Crosshair rangeCrosshair; 
     List rangeCrosshairs = crosshairOverlay.getRangeCrosshairs(); 
     if (rangeCrosshairs.isEmpty()) { 
      rangeCrosshair = new Crosshair(); 
      rangeCrosshair.setPaint(BlueStripeColors.LIGHT_GRAY_C0); 
      crosshairOverlay.addRangeCrosshair(rangeCrosshair); 
     } 
     else { 
      // We only have one at a time 
      rangeCrosshair = (Crosshair) rangeCrosshairs.get(0); 
     } 

     rangeCrosshair.setValue(y); 
    } 
} 

Beachten Sie, dass crosshairOverlay eine Instanz von CrosshairOverlay ist.

+1

Könnten Sie hier posten Sie Ihre Code plz? –

0

Das erste, was mir in den Sinn kommt, wäre, einen benutzerdefinierten Cursor zu schreiben und es auf Ihrem Diagramm zu setzen. Es kann einen Verweis auf das Diagramm haben und den x-Wert hervorheben, der mit dem x/y-Standort des Cursors übereinstimmt.

1

JFreeChart kann einen Unterabschnitt eines Diagramms nicht darstellen, daher sollten Sie etwas tun, das kein Neuzeichnen des Diagramms erfordert. Sie könnten Ihr Diagramm in ein BufferedImage schreiben und dieses im Speicher ablegen und dann eine benutzerdefinierte Komponente verwenden, die das gepufferte Diagramm als Hintergrundbild verwendet und Fadenkreuze und andere Popup-Fenster darüber zeichnet.

Es gibt Methoden in JFreeChart, um den Datenpunkt für eine gegebene Koordinate in einem gerenderten Diagramm zu erhalten. Erinnere dich nicht daran, was das in meinem Kopf ist. Je nach Ihren Anforderungen könnten Sie Ihre eigenen Diagrammdaten rendern, das ist nicht so schwer wie Sie denken.

0

Das funktionierte für mich. Ich habe die

chartPanel.addChartMouseListener(new ChartMouseListener() { 
public void chartMouseMoved(ChartMouseEvent event) 
    { 
    try 
    { 
     double[] values = getCrossHairValue(event); 

     plot.clearRangeMarkers(); 
     plot.clearDomainMarkers(); 

     Marker yMarker = new ValueMarker(values[1]); 
     yMarker.setPaint(Color.darkGray); 
     plot.addRangeMarker(yMarker); 

     Marker xMarker = new ValueMarker(values[0]); 
     xMarker.setPaint(Color.darkGray); 
     plot.addDomainMarker(xMarker); 

     chartPanel.repaint(); 
    } catch (Exception e) 
    { 

    } 
    } 

}

+7

Was ist mit der Methode getCrossHairValue? Woher kommt das? –

+0

Ich denke, dass nur zurückkehrt: 'int mouseX = event.getTrigger(). GetX(); \t \t int mausY = event.getTrigger(). GetY(); ' – 2c00L