2014-01-16 2 views
2

XYPlot에서 마우스를 움직일 때 마우스가 움직일 때 마우스의 좌표가 차트 근처에서만 나타납니다. 즉, 십자선이 다른 점으로 이동하면 십자선을 따라 좌표 값의 위치가 이동합니다.JFreeChart : 힌트 (마우스 이동시) 근처에서 마우스 좌표 근처에 마우스를 놓습니다.

1 개의 수평선과 1 개의 수직선이 그려지며, 마우스가 끝나는 지점에서 특히 교차합니다.

이것이 가능합니까? 지금까지 ChartMouseListener 및 chartMouseMoved 메소드를 사용하여 좌표를 가져 와서 콘솔에 인쇄했습니다.

이 내 프로젝트와 어떻게 마우스로 차트가되고 싶어요 ..

example of my app

답변

6

JFreeChart의이 십자선을위한 매우 유연 지원을하고있다. 당신이 설명한 것을하기 위해 ChartPanel에 Overlay를 사용하고 ChartMouseListener에서 십자선을 업데이트합니다. 여기에 (나는 우리가 JFreeChart Developer Guide와 함께 제공되는 데모의 컬렉션에 추가 할 것) 자체에 포함 된 예는 다음과 같습니다 답변에 대한

package org.jfree.chart.demo; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartMouseEvent; 
import org.jfree.chart.ChartMouseListener; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.panel.CrosshairOverlay; 
import org.jfree.chart.plot.Crosshair; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.general.DatasetUtilities; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.RectangleEdge; 

/** 
* A demo showing crosshairs that follow the data points on an XYPlot. 
*/ 
public class CrosshairOverlayDemo1 extends JFrame implements ChartMouseListener { 

    private ChartPanel chartPanel; 

    private Crosshair xCrosshair; 

    private Crosshair yCrosshair; 

    public CrosshairOverlayDemo1(String title) { 
     super(title); 
     setContentPane(createContent()); 
    } 

    private JPanel createContent() { 
     JFreeChart chart = createChart(createDataset()); 
     this.chartPanel = new ChartPanel(chart); 
     this.chartPanel.addChartMouseListener(this); 
     CrosshairOverlay crosshairOverlay = new CrosshairOverlay(); 
     this.xCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f)); 
     this.xCrosshair.setLabelVisible(true); 
     this.yCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f)); 
     this.yCrosshair.setLabelVisible(true); 
     crosshairOverlay.addDomainCrosshair(xCrosshair); 
     crosshairOverlay.addRangeCrosshair(yCrosshair); 
     chartPanel.addOverlay(crosshairOverlay); 
     return chartPanel; 
    } 

    private JFreeChart createChart(XYDataset dataset) { 
     JFreeChart chart = ChartFactory.createXYLineChart("Crosshair Demo", 
       "X", "Y", dataset); 
     return chart; 
    } 

    private XYDataset createDataset() { 
     XYSeries series = new XYSeries("S1"); 
     for (int x = 0; x < 10; x++) { 
      series.add(x, x + Math.random() * 4.0); 
     } 
     XYSeriesCollection dataset = new XYSeriesCollection(series); 
     return dataset; 
    } 

    @Override 
    public void chartMouseClicked(ChartMouseEvent event) { 
     // ignore 
    } 

    @Override 
    public void chartMouseMoved(ChartMouseEvent event) { 
     Rectangle2D dataArea = this.chartPanel.getScreenDataArea(); 
     JFreeChart chart = event.getChart(); 
     XYPlot plot = (XYPlot) chart.getPlot(); 
     ValueAxis xAxis = plot.getDomainAxis(); 
     double x = xAxis.java2DToValue(event.getTrigger().getX(), dataArea, 
       RectangleEdge.BOTTOM); 
     double y = DatasetUtilities.findYValue(plot.getDataset(), 0, x); 
     this.xCrosshair.setValue(x); 
     this.yCrosshair.setValue(y); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       CrosshairOverlayDemo1 app = new CrosshairOverlayDemo1(
         "JFreeChart: CrosshairOverlayDemo1.java"); 
       app.pack(); 
       app.setVisible(true); 
      } 
     }); 
    } 

} 
+0

감사 정말 날이 날 문제를 파악하는 데 도움이됩니다. 내 ChartMouseListener에 대해 별도의 클래스를 사용하지만 덕분에 작동하기 때문에 약간 변경해야했습니다. 여기 ChartMouseListener 클래스의 구현에 대한 내 변경 사항 (chartMouseMove에서만)입니다 : – Universe

+0

여기 코드 : (외관을 위해 유감스러운) 공개 무효 chartMouseMoved (ChartMouseEvent cmevent) { \t ChartEntity chartentity = cmevent.getEntity(); if (chartentity instanceof XYItemEntity) { XYItemEntity e = (XYItemEntity) chartentity; XY 데이터 세트 d = e.getDataset(); int s = e.getSeriesIndex(); int i = e.getItem(); double x = d.getXValue (s, i); double y = d.getYValue (s, i); \t Demo.getXCrosshair(). setValue (x); \t Demo.getYCrosshair(). setValue (y); \t} } 데모는 JFrame을 만드는 "기본"클래스의 스냅 샷입니다. – Universe

관련 문제