JFreeChart:将鼠标附近的鼠标坐标作为提示(鼠标移动时)

我想要的是,在XYPlot上,鼠标的坐标显示为鼠标附近的提示,当(鼠标)仅在图表上移动时! 换句话说,当十字准线移动到另一个点时,坐标值的定位也会在十字准线之后移动。

此外,还将绘制1条水平线和1条垂直线,这些线在鼠标hover的位置专门相交。

这可能吗? 到目前为止,我可以使用ChartMouseListener和chartMouseMoved方法获取坐标并在控制台上打印。

这是我的项目以及我希望如何成为鼠标图表..

我的应用程序的示例

JFreeChart对十字准线提供了非常灵活的支持。 要执行您所描述的操作,我将在ChartPanel上使用Overlay,并从ChartMouseListener更新十字准线。 这是一个自包含的示例(我将添加到我们随JFreeChart开发人员指南一起提供的演示集合中):

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