2009-12-14 33 views
6

XY grafiklerini yapmak için JFreeChart kullanıyoruz ve fareyle birlikte hareket eden ve farenin x değeriyle en yakından eşleşen veri noktasını vurgulayan bir artı işareti yapmamız için bir özellik isteğimiz var. Google Finans'ta benzer bir örneği görebilirsiniz - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC.JFreeChart'da fareyi takip eden çapraz çizgi yapan var mı?

Bu Google grafikleri yalnızca geçerli değeri vurgulamalı (bunu yapmak istiyoruz ve artı işaretleri gösteriyoruz), ancak aradığımız canlı fare etkileşimini gösterirler.

Herhangi bir şık önerisi olan var mı?

Teşekkürler.

cevap

4

Bunu bir fare dinleyicisi ve CrosshairOverlay sınıfı kullanarak çalışıyorum. Tatil seyahatinden döndükten sonra kodumu göndereceğim. Çok zor olmadı.


Üzgünüm, bunu unuttum!

İlk olarak, crosshair'inizi istediğiniz yere ait x, y değerlerini hesaplamak istiyorsunuz. Benim için hattımızın noktaları boyunca hareket etmesini istedim, bu yüzden en yakın x değerini hesapladım ve x, y için veri çiftini kullandım. crosshairOverlay CrosshairOverlay bir örneğidir

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

Not:

Sonra bu yöntemi çağırın.

+1

buradan kod sonrası kurdu? –

0

Aklıma gelen ilk şey, özel bir Cursor yazmak ve haritanıza ayarlamak olacaktır. Grafiğe referans verebilir ve İmleç'in x/y konumuyla tutarlı olan x değerini vurgulayabilir.

1

JFreeChart grafiğin bir alt bölümünü oluşturamıyor, bu yüzden grafiğin yeniden boyanması gerekmeyen bir şey yapmak istersiniz. Grafiğinizi bir BufferedImage'a yazabilir ve bunu bellekte saklayabilir, daha sonra arka plan görüntüsü olarak arabelleğe alınmış grafiği kullanan özel bir bileşene sahip olabilirsiniz ve üzerinde artı işaretlerini ve diğer açılır pencereleri çizebilirsiniz.

İşlenmiş bir grafikte belirli bir koordinat için veri noktası almak için JFreeChart'da yöntemler vardır. Bunların başımın üstünden ne olduğunu hatırlama. İhtiyaçlarınıza bağlı olarak, kendi grafik verilerinizi oluşturmayı düşünebilirsiniz, düşündüğünüz kadar zor değil.

0

Bu benim için çalıştı. Ben

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

    } 
    } 

} Eğer plz Could

+7

getCrossHairValue yöntemi nedir? Nereden geliyor? –

+0

Sadece döner: 'int mouseX = event.getTrigger(). GetX(); \t int mouseY = event.getTrigger(). GetY(); ' – 2c00L

İlgili konular