2012-09-19 116 views
1

我需要能够从MouseListener返回一个点,并确定散点图中的最近点。我正在使用带有XYDataset的JFreeChart。如何在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相对于报表点左上角的ChartPanel的,所以(0,0)以上职称,离开x轴的轴标签。但是,valueToJava2D方法给出了相对于绘制值的区域的值,因此(0,0)低于图形标题和x轴标签的右侧。这意味着当鼠标直接在我的一个数据点上时,我会得到一个非零的差异!

我该如何解决这种差异?

感谢, 埃里克

+0

交叉发布[这里](http://www.jfree.org/forum/viewtopic.php?f=3&t=115753)。 – trashgod

回答

1

我想看看一个ChartMouseListener,说明herehere

如果这还不够,你可能不得不看看轴的区域和边缘的含义。

这可能有助于解释目标,而不是您目前的方法。或者,编辑您的问题以包含显示当前方法的sscce。许多简短的例子可能被发现here

附录:最大点数的实际限制很小。

对于合理的点数,可以放大Shape,如herehere;另请参阅ShapeUtilities。要调出详细信息,请考虑一个自定义工具提示生成器,检查here

+0

当鼠标直接位于图形中的一个点上时,ChartMouseListener效果很好。但是,我希望能够在鼠标不直接在某个点上时找到最近的点。有任何想法吗?我的目标是当鼠标仅仅靠近某一点时,向用户提供有用的反馈信息,但不直接在其上。 –

+0

“最接近”的匹配肯定需要使用一些合适的度量来迭代数据集。由于这似乎是资源密集型的,你能否详细说明目标? – trashgod

+0

该图表示国际象棋服务器的游戏请求。图表看起来不错,但分数有点小。我希望在不改变图形美感的情况下,让用户接受更大游戏的有效点击区域。我还想给用户提供关于挑战(评级,时间等等)的信息,当用户“接近”这个点时,不需要太多的精确度,以至于鼠标正好在它上面。最大点数的实际限制非常小,因此迭代和执行数学计算的时间不成问题。 –