Frage

Wir verwenden JFreeChart XY Plots zu machen und wir haben eine Feature-Anfrage ein Fadenkreuz, dass bewegt sich mit der Maus und Highlights der Datenpunkt, die am ehesten abbildet zur x-Wert der Maus zu tun. Sie können ein ähnliches Beispiel bei Google Finance sehen - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC .

Diese nur Google-Charts den aktuellen Wert markieren (wir tun wollen, dass und zeigen auch Fadenkreuz), aber sie zeigen die Live-Maus Interaktion, die wir suchen.

Wer noch keine eleganten Vorschläge?

Danke.

War es hilfreich?

Lösung

Ich habe diese Arbeit mit einem Maus-Listener und die CrosshairOverlay Klasse. Nachdem ich aus dem Urlaub Reise zurück, werde ich meinen Code schreiben. Es endete nicht allzu schwer sein.


Sorry, ich vergaß darüber!

Als erstes sollten Sie die x, y-Werte berechnen, wo Sie Ihr Fadenkreuz mögen. Für mich, ich wollte es entlang der Punkte unserer Linie bewegen, so dass ich den x-Wert berechnet und verwendet das 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 ist eine Instanz CrosshairOverlay.

Andere Tipps

JFreeChart kann kein Unterabschnitt eines Diagramms machen, so dass Sie etwas tun, werden Sie wollen, dass nicht das Diagramm neu zu streichen erfordert. Sie könnten Ihr Diagramm eine BufferedImage und Speicher schreiben, dass im Speicher, dann eine benutzerdefinierte Komponente hat, die die gepufferte Grafik als Hintergrundbild verwendet und zeichnen Fadenkreuz und andere Popup-Fenster darüber hinweg.

Es gibt Methoden in JFreeChart den Datenpunkt für ein auf einem gerenderten Diagramm koordinieren gegeben zu bekommen. Sie nicht daran erinnern, was diese aus der Spitze von meinem Kopf. Je nach Bedarf, könnten Sie Ihre eigene Diagrammdaten Rendering, es ist nicht so schwer wie Sie denken.

Das erste, was mir in den Sinn kommt wäre eine benutzerdefinierte schreiben Cursor und setzen sie ihn auf Ihrer Karte. Es kann auf die Tabelle einen Verweis und den x-Wert hervorheben, die mit dem Cursor der x / y-Position konsistent ist.

Das ist für mich gearbeitet. 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)
    {

    }
    }

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top