2010-07-22 9 views
7

Ich habe eine JFreeChart Instanz, die Prozessspeicherstatus anzeigt, wie folgt initialisiert:JFreeChart: erhalten Datenquelle Wert auf Mausklick

m_data = new TimeSeriesCollection(); 
TimeSeries vmsize = new TimeSeries("VMSize"); 
TimeSeries resident = new TimeSeries("Resisdent"); 
TimeSeries shared = new TimeSeries("Shared memory"); 
TimeSeries code = new TimeSeries("Code"); 
TimeSeries data = new TimeSeries("Data"); 
m_data.addSeries(vmsize); 
m_data.addSeries(resident); 
m_data.addSeries(shared); 
m_data.addSeries(code); 
m_data.addSeries(data); 
JFreeChart chart = ChartFactory.createTimeSeriesChart("Memory usage", "Time", "Size", m_data, true, true, false); 
m_chart = new ChartPanel(chart); 

Später ich hinzufügen, Werte zu jedem Timeseries im TimeSeriesCollection. Ich möchte irgendwie wissen - wenn der Benutzer auf das Diagramm klickt - entweder welche Zeit mit dieser Spalte verbunden ist, oder noch besser - was ist der Index des Wertes.

Ich schaute auf die JFreeChart und ChartMouseListener Klassen, aber ich konnte nicht herausfinden, wie man das macht (auch die Dokumentation von JFreeChart ist ärgerlich knapp, ich denke, sie versuchen, Leute zu ihrem Entwicklerhandbuch zu kaufen).

Antwort

2

hmm funktionieren sollte, wenn man die letzten beiden Zeilen von so etwas wie diese ersetzen:

ChartPanel panel=new ChartPanel(ChartFactory.createTimeSeriesChart("Memory usage", "Time", "Size", m_data, true, true, false))); 
panel.addChartMouseListener(new ChartMouseListener(){ 
    void chartMouseClicked(ChartMouseEvent e){ 
     [...do something on click...] 
    } 
    void chartMouseMoved(ChartMouseEvent e){ 
     [...do something on move...] 
    } 
}); 
return panel; 
+0

Nun, ich habe mir ChartMouseLIstener schon angeschaut, die Informationen im Ereignis sind ziemlich nutzlos. Die Frage ist nicht, wie man einen Listener hinzufügt - sondern wie man die relevanten Daten aus dem Event erhält. –

+0

können Sie ChartEvent.getEntity() verwenden, um die Form (Leiste, Linie) unter der Maus http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/entity/ChartEntity.html – fasseg

+0

+ zu erhalten 1, funktioniert wie ein Champion! – trashgod

3

, wenn Sie auf den Eintrag tot klicken, wird der event.getEntity() Funktion gibt XYItem und dann von dort weiter

XYItemEntity xyitem=(XYItemEntity) event.getEntity(); // get clicked entity 
XYDataset dataset = (XYDataset)xyitem.getDataset(); // get data set 
System.out.println(xyitem.getItem()+" item of "+xyitem.getSeriesIndex()+"series"); 
System.out.println(dataset.getXValue(xyitem.getSeriesIndex(), xyitem.getItem())); 
System.out.println(dataset.getYValue(xyitem.getSeriesIndex(), xyitem.getItem())); 
Comparable comparable=dataset.getSeriesKey(0); 
XYPlot xyplot = (XYPlot) event.getChart().getPlot(); 
System.out.println(xyplot.getRangeCrosshairValue()); 

jedoch incase Sie klicken Sie nicht auf das Element selbst, sondern Ihre Fadenkreuz auf Daten auf automatische Sperre gesetzt ist, in einem solchen Fall das Fadenkreuz wird zum nächsten Punkt bewegen, aber da das Element nicht geklickt wurde, werden Sie nicht sein in der Lage, das XYItem zu bekommen und daher können Sie den Serien- und Artikelindex nicht kennen, Um dieses Problem zu lösen, gibt es diesen Code unten, sollte es in der Fangklausel gesetzt werden, während der oben genannte Code sollte in Try-Klausel

zuerst definieren Sie eine Funktion, die Fadenkreuz Wert bei Domäne und Bereich und auch Xydataset nehmen wird, dies Funktionen gibt ein inneres Klassenobjekt zurück, das Artikelindex und Serienindex zusammenfasst

wie man es benutzt?

try{......code block from the top 

}catch(Exception e){ 

Object source=event.getSource(); 
JFreeChart chartpanel=(JFreeChart)source; 
XYPlot xyplot = (XYPlot) chartpanel.getPlot(); 
XYDataset xydataset= xyplot.getDataset(); 
double d=xyplot.getDomainCrosshairValue(); //get crosshair X value 
double r =xyplot.getRangeCrosshairValue(); //get crosshair y value 
SeriesAndItemIndex index=getItemIndex(d,r,xydataset); 
if(index != null){ 
    System.out.println(index.toString()); 
} 
} 
+0

Zu welchem ​​Ereignis soll ich mich anmelden und auf welches Objekt? Ich habe versucht, einen Change-Listener zum JFreeChart hinzuzufügen, aber es ist kein getEntity. –

+0

Ich denke, seine ChartChangelistner ... so etwas – user482963