答案说明符
当我第一次阅读您的问题时,我认为它是关于在您的问题中挑选或选择图像的一部分,但也许不是,而且只是关于如何表示和绘制对象,而不是与它的一部分进行交互。如果不需要交互,您可以忽略答案的挑选部分,只查看形状表示部分。
挑选
您可以通过多种方式实现上述结果。您尝试实现的技术术语是“挑选”,但除了挑选之外,还有很多事情可能会影响您表示对象的方式,以及您使用 2D 还是 3D 系统,甚至 JavaFX 是否最合适您的应用程序的框架。您可能需要 3D 系统,或者 2D 系统在您的情况下可能就足够了(我不知道)。
相关信息:
选择结果
链接挑选文章中的示例处理程序:
EventHandler<MouseEvent> moveHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
PickResult res = event.getPickResult();
// do something with the pick result.
event.consume();
}
}
那篇挑选文章使用PickResult。 PickResult 可以解释 2D 和 3D 信息。在二维信息的情况下,通常只有选择的节点是相关的。在 3D 拾取的情况下,它提供附加信息,例如纹理坐标和拾取的 3D 面。
setOnMouseClicked等便捷方式
通常在 2D 中,除了已选择的节点之外,您不需要很多其他信息。在这种情况下,您不需要查询和查看 PickResult 中的所有信息。您可以使用"convenience methods" 进行用户交互处理,例如setOnMouseClicked。在所有节点上设置一个点击处理程序,您将能够通过其相关的点击处理程序在每个节点被点击时对其进行操作(类似于按钮的功能)。
对于不规则形状,您可能希望确保拥有setPickOnBounds(false)。另请注意,如果选择边界为假,并且您希望在不规则形状内单击以进行注册,则形状内部必须用颜色填充(与您的图片不同)。如有必要,颜色可以是半透明的,但不是完全透明的。这是因为如果您没有任何可点击的内容,则点击不会注册。
悬停时绑定
有关在节点的悬停属性更改状态时采取操作的示例,请参阅此问题的 smurf 答案。
实施您自己的命中测试
当场景图中有节点时,可以利用hit-testing的JavaFX内置系统进行pick关联。
另一种选择是在Canvas 内渲染您的图像,而不使用场景图,然后实现您自己的命中测试算法并使用它。这就是垃圾神对以下问题的回答中说明的解决方案:
如果您使用painter's algorithm 在画布内渲染复杂的重叠形状,这可能会变得复杂。因此,我建议使用具有 2D 或 3D 形状的场景图,而不是使用画布来完成此任务。
形状表示
您可以执行此操作的示例方法:
选择哪种表示取决于应用程序,因为有些表示会更适合不同的目的。对于您在问题中显示的图像,您似乎有同一对象的各种 orthographic projections,使用 ParallelCamera 将 3D 表示渲染到 2D 平面上可能是最好的。对于许多其他应用程序,位图 2D 图像是最好的。
如果您有适当的路径信息,您可以使用SVGPath 来表示不规则的 2D 形状。如果您没有适当的路径信息,那么使用 2D 系统来表示一组复杂的图像(就像您在问题中遇到的那样)将具有挑战性(即使有路径信息也可能对您具有挑战性)。
形状表示的另一个选项是Images 从位图文件(例如 PNG)中读取,这些文件具有透明背景以允许不规则形状。
一边
这个问题可能会因为不够集中而被关闭,因为这正是此类问题所发生的情况。这个答案在范围上同样更笼统,而不是具体,特别是,它没有提供完整的代码(或根本没有任何代码)供您为您在问题中概述的问题实施解决方案。