首页 > 解决方案 > 如何将本地坐标转换为 JavaFX 图表坐标

问题描述

对于业务应用程序,用户必须能够选择 JavaFX LineChart 的某个部分。目前,我已经使用 onMousePressed、onMouseDragged 和 onMouseReleased 侦听器与 JavaFX Rectangle 和一些坐标魔术结合使用选择框。当我对这些事件执行 .getX() 和 .getY() 时,我得到了在图表上绘制矩形的适当坐标。这些是相对于我假设的 JavaFX 图表的坐标?

当用户做出选择时,这个矩形会覆盖图表,并允许用户对他们的选择做任何他们想做的事情或绘制一个新的选择。这一切都有效,但是当用户开始从先前的选择中绘制时,这将采用相对于 Rectangle 的坐标。我的问题如下:如何使鼠标事件的矩形“透明”并将这些事件发送到底层组件(LineChart)。或者有没有办法将这些坐标转换为 LineChart 坐标。

请注意,我已经在所有不同部分尝试了 localToParent、localToScene、sceneToLocal 和 sceneToLocal。即使我不完全了解该属性的确切工作方式,我也尝试以不同方式更改 pickOnBounds 。

谢谢,

标签: javajavafxcharts

解决方案


目前,我已经使用 onMousePressed、onMouseDragged 和 onMouseReleased 侦听器与 JavaFX Rectangle 和一些坐标魔术结合使用选择框。当我对这些事件执行 .getX() 和 .getY() 时,我得到了在图表上绘制矩形的适当坐标。这些是相对于我假设的 JavaFX 图表的坐标?

不,它与图表无关,它是您单击的目标节点的局部坐标。请参阅MouseEvent::getX的文档:

事件相对于 MouseEvent 源的水平位置。

图表是由许多节点和窗格组成的复杂事物,每个节点和窗格都可以有自己的局部坐标系。因此 getX 将返回什么取决于您单击的实际内容。例如,如果您在图表顶部覆盖一个半透明的填充矩形,然后在矩形内部单击,则坐标将是矩形内的局部坐标。

如何使鼠标事件的矩形“透明”并将这些事件发送到底层组件(LineChart)。

使矩形鼠标透明

rectangle.setMouseTransparent(true);

或者有没有办法将这些坐标转换为 LineChart 坐标。

您可以使用调用mouseEvent.getSceneX() 来获取场景坐标,而不是本地坐标。

然后,您可以将坐标转换为您希望使用的任何节点的本地坐标node.sceneToLocal(sceneX, sceneY)

node.sceneToLocal(mouseEvent.getSceneX(), mouseEvent.getSceneY());

因此,只要您在折线图中引用了要确定鼠标单击的相对坐标的相关节点,就可以做到这一点。


推荐阅读