2014-01-16 189 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