2009-12-14 8 views
6

हम XY प्लॉट बनाने के लिए JFreeChart का उपयोग कर रहे हैं और हमारे पास एक क्रॉसहेयर करने का एक फीचर अनुरोध है जो माउस के साथ चलता है और डेटा बिंदु को हाइलाइट करता है जो माउस के एक्स-वैल्यू के सबसे नज़दीकी मानचित्र हैं। आप Google वित्त - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC पर एक समान उदाहरण देख सकते हैं।क्या किसी ने क्रॉसहेयर किया है जो JFreeChart में माउस का पालन करता है?

वे Google चार्ट केवल वर्तमान मान को हाइलाइट करते हैं (हम ऐसा करना चाहते हैं और क्रॉसहेयर भी दिखाते हैं), लेकिन वे लाइव माउस इंटरैक्शन दिखाते हैं जिसे हम ढूंढ रहे हैं।

किसी के पास कोई सुरुचिपूर्ण सुझाव है?

धन्यवाद।

उत्तर

4

मुझे यह माउस श्रोता और क्रॉसहेयर ओवरले क्लास का उपयोग करके काम कर रहा है। छुट्टियों की यात्रा से वापस आने के बाद, मैं अपना कोड पोस्ट करूंगा। यह बहुत मुश्किल नहीं हो गया।


क्षमा करें, मैं इसके बारे में भूल गया!

सबसे पहले, आप एक्स, वाई मानों की गणना करना चाहते हैं जहां आप अपना क्रॉसहेयर चाहते हैं। मेरे लिए, मैं चाहता था कि यह हमारी लाइन के बिंदुओं के साथ आगे बढ़े, इसलिए मैंने निकटतम एक्स मान की गणना की और एक्स, वाई के लिए डेटा जोड़ी का उपयोग किया।

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

ध्यान दें कि crosshairOverlay CrosshairOverlay का एक उदाहरण है:

तब मैं इस विधि कहते हैं।

+1

तुम plz सकता है यहां पोस्ट अपने कोड सेट? –

0

पहली बात जो मेरे दिमाग में आती है वह एक कस्टम Cursor लिखना होगा और इसे अपने चार्ट पर सेट करना होगा। इसमें चार्ट का संदर्भ हो सकता है और एक्स मान को हाइलाइट कर सकता है जो कर्सर के x/y स्थान के अनुरूप है।

1

जेएफरी चार्ट चार्ट के उपधारा को प्रस्तुत नहीं कर सकता है, इसलिए आप ऐसा कुछ करना चाहते हैं जिसके लिए चार्ट को पुनर्स्थापित करने की आवश्यकता नहीं है। आप अपने चार्ट को BufferedImage पर लिख सकते हैं और उस मेमोरी में स्टोर कर सकते हैं, उसके बाद एक कस्टम घटक है जो बफरर्ड चार्ट का उपयोग पृष्ठभूमि छवि के रूप में करता है, और क्रॉसहेयर और अन्य पॉपअप विंडो खींचता है।

एक प्रस्तुत चार्ट पर दिए गए समन्वय के लिए डेटा बिंदु प्राप्त करने के लिए JFreeChart में विधियां हैं। याद मत करो कि ये मेरे सिर के ऊपर से क्या हैं। आपकी जरूरतों के आधार पर, आप अपना खुद का चार्ट डेटा प्रस्तुत करने पर विचार कर सकते हैं, यह उतना कठिन नहीं है जितना आप सोचेंगे।

0

यह मेरे लिए काम किया। मैं

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

getCrossHairValue विधि के बारे में क्या? यह कहां से आता है? –

+0

मुझे लगता है कि बस लौटाता है: 'int mouseX = event.getTrigger()। GetX(); \t \t int mouseY = event.getTrigger()। GetY(); ' – 2c00L

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