2009-12-14 7 views
6

Usiamo JFreeChart per creare grafici XY e abbiamo una richiesta di funzionalità per fare un mirino che si muove insieme al mouse ed evidenzia il punto dati che più strettamente associa al valore x del mouse. Puoi vedere un esempio simile su Google Finance - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC.Qualcuno ha fatto dei mirini che seguono il mouse in JFreeChart?

Questi grafici di Google evidenziano solo il valore corrente (vogliamo farlo e mostrano anche i mirini), ma mostrano l'interazione del mouse live che stiamo cercando.

Qualcuno ha qualche suggerimento elegante?

Grazie.

risposta

4

Ho ottenuto questo funzionamento utilizzando un listener del mouse e la classe CrosshairOverlay. Dopo che sarò tornato da un viaggio di vacanza, posterò il mio codice. Finì per non essere troppo difficile.


Mi dispiace, ho dimenticato questo!

Prima di tutto, si desidera calcolare i valori x, y per il punto in cui si desidera il mirino. Per me, volevo che si muovesse lungo i punti della nostra linea, quindi ho calcolato il valore x più vicino e ho usato quella coppia di dati per x, y.

Poi chiamo questo metodo:

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); 
    } 
} 

noti che crosshairOverlay è un'istanza di CrosshairOverlay.

+1

Potrebbe plz pubblicare il tuo codice di qui? –

0

La prima cosa che mi viene in mente sarebbe scrivere un'personalizzata e impostarla sul grafico. Può avere un riferimento al grafico ed evidenziare il valore x che è coerente con la posizione x/y del cursore.

1

JFreeChart non può eseguire il rendering di una sottosezione di un grafico, quindi è consigliabile eseguire un'operazione che non richieda di ridisegnare il grafico. Puoi scrivere il tuo grafico su una BufferedImage e archiviarlo in memoria, quindi disporre di un componente personalizzato che utilizza il grafico a buffer come immagine di sfondo e disegna su di esso mirini a croce e altre finestre popup.

Esistono metodi in JFreeChart per ottenere il punto dati per una determinata coordinata in un grafico sottoposto a rendering. Non ricordare che cosa sono fuori di testa. A seconda delle tue esigenze, potresti prendere in considerazione il rendering dei dati del tuo grafico, non è così difficile come penseresti.

0

Questo ha funzionato per me. Ho impostato il

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

E il metodo getCrossHairValue? Da dove proviene? –

+0

Penso che restituisca semplicemente: 'int mouseX = event.getTrigger(). GetX(); \t \t int mouseY = event.getTrigger(). GetY(); ' – 2c00L

Problemi correlati