2014-01-16 192 views
2

當鼠標移動到圖表上時,我想要的是,在XY圖上,鼠標的座標顯示爲靠近鼠標的提示! 換句話說,當十字準線移動到另一個點時,座標值的位置也會跟隨十字準線移動。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

這裏是代碼: (對不起) public void chartMouseMoved(ChartMouseEvent cmevent){ \t ChartEntity chartentity = cmevent.getEntity();如果(XYItemEntity的chartentity實例)XYItemEntity e =(XYItemEntity)chartentity; XYDataset 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} } Demo是我的「main」類的快照,其中創建JFrame – Universe