2010-07-22 11 views
7

मैं एक JFreeChart उदाहरण है कि इस प्रक्रिया स्मृति स्थिति प्रदर्शित करता है, प्रारंभ क्लिक करें:JFreeChart: प्राप्त माउस पर डेटा स्रोत मूल्य इस प्रकार

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

बाद में मैंने TimeSeriesCollection में प्रत्येक TimeSeries में मान जोड़ते। मैं किसी भी तरह से जानना चाहता हूं - जब उपयोगकर्ता चार्ट पर क्लिक करता है - या तो उस कॉलम से जुड़ा समय, या इससे भी बेहतर - मूल्य की अनुक्रमणिका क्या है।

मैंने जेएफरी चार्ट और चार्टमाउस लिस्टनर कक्षाओं को देखा, लेकिन मुझे यह नहीं पता था कि यह कैसे करना है (जेएफरी चार्ट का दस्तावेज भी काफी दुर्लभ है, मुझे लगता है कि वे लोगों को अपने डेवलपर की मार्गदर्शिका खरीदने के लिए प्राप्त करने की कोशिश कर रहे हैं)।

उत्तर

2

हम्म, काम करना चाहिए अगर आप कुछ इस तरह से अंतिम दो पंक्तियों को बदल दें: यदि आप आइटम पर मृत क्लिक

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

ठीक है, मैंने पहले ही चार्टमाउसलिस्टर को देखा है, घटना में जानकारी बहुत बेकार है। प्रश्न यह नहीं है कि श्रोता को कैसे जोड़ा जाए - बल्कि घटना से प्रासंगिक डेटा कैसे प्राप्त करें। –

+0

आप माउस के नीचे आकृति (बार, रेखा) प्राप्त करने के लिए ChartEvent.getEntity() का उपयोग कर सकते हैं http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/entity/ChartEntity.html – fasseg

+0

+ 1, एक चैंप की तरह काम करता है! – trashgod

3

, event.getEntity() फ़ंक्शन XYItem और फिर बाद

वहाँ से
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()); 

लेकिन आप स्वयं आइटम पर क्लिक न करें बैठाना लेकिन अपने क्रॉसहेयर डेटा पर स्वत: लॉक हो जाता है, इस तरह के मामले में क्रॉसहेयर निकटतम आइटम पर जाता रहेगा लेकिन जब से आइटम क्लिक किया नहीं किया गया है, तो आप नहीं होगा XYItem प्राप्त करने में सक्षम है और इसलिए आप श्रृंखला और आइटम सूचकांक को नहीं जान सकते हैं, इस समस्या को हल करने के लिए नीचे यह कोड है, इसे कैच क्लॉज में रखा जाना चाहिए जबकि ऊपर उल्लिखित कोड प्रयास खंड

पहले एक फ़ंक्शन को परिभाषित करता है जो डोमेन और रेंज और Xydataset पर क्रॉसहेयर मान लेगा, यह फ़ंक्शंस एक आंतरिक वर्ग ऑब्जेक्ट देता है जो समूह आइटम इंडेक्स और श्रृंखला सूचकांक

public static SeriesAndItemIndex getItemIndex(double domainVal,double rangeVal,XYDataset xydataset){ 
Comparable comparable; 
int indexOf; 
for(int i=0;i<xydataset.getSeriesCount();i++){ 

comparable = xydataset.getSeriesKey(i); 
    indexOf=xydataset.indexOf(comparable); 
for(int j=0 ; j<xydataset.getItemCount(indexOf);j++){ 

    double x=xydataset.getXValue(indexOf, j); 
    double y=xydataset.getYValue(indexOf, j); 

    if(x == domainVal && y==rangeVal){ 
     return new SeriesAndItemIndex(j,indexOf);//return item index and series index 
       } 


      } 
     } 
     return null; 
    } 

private static class SeriesAndItemIndex{ ///inner CLASS to group series and item clicked index 
     public int itemIndex; 
     public int seriesIndex; 
     public SeriesAndItemIndex(int i,int s){ 
      itemIndex=i; 
      seriesIndex=s; 
     } 

     @Override 
     public String toString(){ 
      return "itemIndex="+itemIndex+",seriesIndex="+seriesIndex; 
     } 
    } 

इसका उपयोग कैसे करें?

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

मुझे किस घटना पर पंजीकरण करना चाहिए और किस वस्तु पर? मैंने JFreeChart में एक परिवर्तन श्रोता को जोड़ने का प्रयास किया, लेकिन इस घटना में एंटिटी नहीं है। –

+0

मुझे लगता है कि इसका चार्टचैंजलिस्टर ... ऐसा कुछ – user482963

संबंधित मुद्दे