我需要能够获取从鼠标侦听器返回的点,并识别散点图中最近的点。 我正在使用带有XYDataset的JFreeChart。
我已经在我的 ChartPanel 中添加了一个鼠标侦听器,并尝试将这些 x,y 值与我遍历数据并检查其位置时返回的值进行比较。 我的代码看起来像这样:
ValueAxis domainAxis = chartPanel.getXYPlot().getDomainAxis();
ChartArea chartArea = chartPanel.getChartRenderingInfo().getChartArea();
for(int i=0; i < myXYData.getItemCount(0); i++) {
double mouseX = e.getX(); // e is the MouseEvent
double pointX = domainAxis.valueToJava2D(myXYData.getX(0, i), chartArea, RectangleEdge.BOTTOM);
System.out.println("difference is " + (pointX - mouseX));
}
问题是 MouseEvent 是相对于图表面板左上角的报告点,因此 (0,0) 位于标题上方和 x 轴标签的左侧。 但是,valueToJava2D 方法给出的值相对于绘制值的区域,因此 (0,0) 位于图形标题下方和 x 轴标签的右侧。 这意味着当鼠标直接在我的一个数据点上时,我得到一个非零的差异!
如何解决这种差异?
谢谢埃里克
我会看一个ChartMouseListener
,在这里和这里说明。
如果这还不够,您可能必须查看轴,其中区域和边缘具有意义。
它可能有助于解释目标,而不是您当前的方法。或者,编辑您的问题以包含显示您当前方法的 sscce。可以在这里找到许多简短的例子。
附录:最大 # 点的实际限制非常小。
对于合理的点数,您可以放大Shape
,如此处和此处所示;另请参阅ShapeUtilities
。若要标注详细信息,请考虑此处检查的自定义工具提示生成器。