2012-09-27 22 views
5

मैं अपने ऐप में माउस क्लिक के साथ डॉट्स सेट करना चाहता हूं। मैं JFreeChart का उपयोग करता हूं और चार्टपैनल माउस श्रोता में उपयोग करता हूं।)चार्ट समन्वय में माउस श्रोता समन्वय को ट्रांसफॉर्मेट करें

panel.addChartMouseListener(new ThisMouseListener()); 

और मेरे माउस श्रोता ThisMouseListener ((यह पूरी नहीं हुई है):: यह इस तरह दिखना है

class ThisMouseListener implements ChartMouseListener{ 

    @Override 
    public void chartMouseClicked(ChartMouseEvent event) { 
     int x = event.getTrigger().getX(); 
     int y = event.getTrigger().getY(); 

     System.out.println("X :" + x + " Y : " + y); 

     ChartEntity entity = event.getEntity(); 
     if(entity != null && (entity instanceof XYItemEntity)){ 
      XYItemEntity item = (XYItemEntity)entity; 
     } 
     new JOptionPane().showMessageDialog(null, "Hello", "Mouse Clicked event", JOptionPane.OK_OPTION); 
    } 

    @Override 
    public void chartMouseMoved(ChartMouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

} 

लेकिन इस माउस श्रोता मुझे मेरे पैनल निर्देशांक वापस आती है और मैं से निर्देशांक प्राप्त करना चाहते मेरा चार्ट क्या मुझे अन्य ऑब्जेक्ट के साथ श्रोता का उपयोग करना चाहिए? या मैं कुछ विधि के साथ निर्देशांक बदल सकते हैं?

+0

आप नए अंक या _select_ मौजूदा _add_ करना चाहते हैं है? कृपया एक [एसएससीई] (http://sscce.org/) शामिल करने के लिए अपना प्रश्न संपादित करें जो आपके वर्तमान दृष्टिकोण को दिखाता है। – trashgod

उत्तर

3

आपने पैनल में श्रोता जोड़ा। इसलिए जब आप माउस पर क्लिक करते हैं तो आपको पैनल के सापेक्ष निर्देशांक प्राप्त होते हैं - जो घटना का स्रोत है। आपको इस श्रोता को इसके बजाय चार्ट में जोड़ना होगा।

अन्य संभावना पैनल के संबंध में चार्ट के निर्देशांक प्राप्त करना और उन्हें एक्स और वाई से घटा देना है।

Point p = chart.getLocation();  
int px = p.getX(); 
int py = p.getY(); 

x = x-px; // x from event 
y = y-py; // y from event 
// x and y are now coordinates in respect to the chart 

if(x<0 || y<0 || x>chart.getWidth() || y>chart.getHeight()) // the click was outside of the chart 
else // the click happened within boundaries of the chart and 

यदि पैनल चार्ट घटक का कंटेनर है तो आपका समाधान उपरोक्त की तरह कुछ दिख सकता है। ध्यान दें कि चार्ट के बाएं कोने के संबंध में ये निर्देशांक निर्देशांक होंगे।

+1

क्या वह थोड़ा भंगुर नहीं होगा? ऐसा लगता है कि आपको विश्वसनीय ज्यामिति प्राप्त करने के लिए रेंडरर के अंदर काम करना होगा। – trashgod

+0

भंगुर से आपका क्या मतलब है? क्या आपको लगता है कि यह किसी बिंदु पर दुर्घटनाग्रस्त हो सकता है? प्रस्तुतकर्ता द्वारा आपका मतलब है श्रोता में chartMouseClicked() फ़ंक्शन (मुझे लगता है कि आप इसका मतलब है- http: //docs.oracle.com/javaee/5/api/javax/faces/render/Renderer.html)? मैंने x और y की घोषणा को छोड़ दिया क्योंकि मैं इसे माउस क्लिक किए गए फ़ंक्शन के अंदर शामिल करने का सुझाव देता हूं, लेकिन उन चर के स्रोत को नोट करने के लिए। – user1581900

+0

मेरा मतलब है कि चार्ट-रिश्तेदार निर्देशांक बदल सकते हैं, जबकि रेंडरर स्क्रीन और मॉडल निर्देशांक के बीच कनवर्ट करने के लिए धुरी का उपयोग कर सकता है। – trashgod

2

एक्स जाओ, वाई अपने ग्राफ अंतरिक्ष में निर्देशांक

double x = event.getChart().getXYPlot().getDomainCrosshairValue(); 
double y = event.getChart().getXYPlot().getRangeCrosshairValue(); 

एक बड़ी समस्या के माध्यम से: मुझे लगता है कि JFreeChart इन मूल्यों के बाद जब तक मेरी ChartMouseEvent हैंडलर कहा जाता है को अद्यतन नहीं करता है; प्रत्येक बार जब मैं पिछले मान प्राप्त करता हूं। आप अपने हैंडलर में वर्तमान मान प्राप्त करने के लिए विवरण के लिए XYPlot.handleClick (x, y, जानकारी) देख सकते हैं।

1

आपको चार्टपैनल का संदर्भ प्राप्त करना होगा, इसे फिर से निकालना होगा और इसके बाद आप प्लॉट से एक सही एक्स, वाई निर्देशांक प्राप्त कर सकते हैं। ऐसा करने के लिए, आपको awt queue पर समन्वय पुनर्प्राप्ति रखना होगा और इसे सीधे कॉल नहीं करना होगा। नीचे एक उदाहरण है कि मेरे लिए काम किया (एक्स के लिए केवल समन्वय)

@Override 
public void chartMouseClicked(ChartMouseEvent cme) { 
    final ChartMouseEvent cmeLocal = cme; 
    ChartPanel hostChartPanel = (ChartPanel) cme.getTrigger().getComponent(); 
    if (null != hostChartPanel) { 

     //Crosshair values are not valid until after the chart has been updated 
     //that is why call repaint() now and post Crosshair value retrieval on the 
     //awt thread queue to get them when repaint() is finished 
     hostChartPanel.repaint(); 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFreeChart chart = cmeLocal.getChart(); 
       XYPlot plot = chart.getXYPlot(); 
       double crossHairX = plot.getDomainCrosshairValue(); 
       JOptionPane.showMessageDialog(null, Double.toString(crossHairX), "X-Value", JOptionPane.OK_OPTION); 
      } 
     }); 
    } 
} 
संबंधित मुद्दे