Java 为什么圆圈隐藏在线的后面?

Java 为什么圆圈隐藏在线的后面?,java,javafx,geometry,Java,Javafx,Geometry,是的,这个标题看起来像是一个笑话的背景,但事实并非如此 问题 我正在用JavaFX编写一个程序。我在一个窗格中添加了一些图形(来自javafx.scene.shape的标准线、圆、矩形等)。我在一些圆上设置了一个onmouseinter(),以更改它们的颜色。这非常有效,除非我在下图中放置一条线: 圆圈A通常会改变颜色,直到我添加行B。当我悬停在圆圈A上时,什么也没有发生 我通过测试发现,当圆位于直线的边界框中时出现了问题(如果圆位于边界框的一半,则向外的那一半表现正确,而里面的那一半表现不正

是的,这个标题看起来像是一个笑话的背景,但事实并非如此

问题 我正在用JavaFX编写一个程序。我在一个窗格中添加了一些图形(来自
javafx.scene.shape
的标准线、圆、矩形等)。我在一些圆上设置了一个
onmouseinter()
,以更改它们的颜色。这非常有效,除非我在下图中放置一条线:

圆圈
A
通常会改变颜色,直到我添加行
B
。当我悬停在圆圈
A
上时,什么也没有发生

我通过测试发现,当圆位于直线的边界框中时出现了问题(如果圆位于边界框的一半,则向外的那一半表现正确,而里面的那一半表现不正确)

这是正常的行为吗?我能做些什么来防止它

部分代码 在ConnectorWidget.java中:

Circle circle = new Circle(...);
circle.setOnMouseEntered(event -> circle.setFill(Color.RED));
circle.setOnMouseExited(event -> circle.setFill(Color.WHITE));
getChildren().add(circle);
ConnectorWidget base = new ConnectorWidget(...);
getChildren().add(base);
在TransistorWidget.java中:

Circle circle = new Circle(...);
circle.setOnMouseEntered(event -> circle.setFill(Color.RED));
circle.setOnMouseExited(event -> circle.setFill(Color.WHITE));
getChildren().add(circle);
ConnectorWidget base = new ConnectorWidget(...);
getChildren().add(base);
在WireWidget中:

Line line = new Line(...);
getChildren().add(line);
单击即可将新的
TransisorWidget
添加到主窗格中

单击一个
ConnectorWidget
然后单击另一个
ConnectorWidget
后,可以在主窗格中创建一个新的
WireWidget

代码的其余部分可以找到(永久链接到我提问时的最后一次提交)


注意:要从GitHub运行代码,您需要。

显然,这与一个
节点
覆盖另一个
节点有关

假设您正在使用
StackPane
作为布局。首先添加
,然后添加
,如果该行包含圆已经包含的一些像素,则
的某些部分将不可见

在这里,我可以想象3可能的解决方案

1) 如果使用的是
画布
,请选择首先绘制的画布。
圆圈
线

2) 如果使用某种布局,则可以使用
getChilder.add/addAll
方法。因此,首先将
圆圈
,然后将
作为子级添加到布局中

(3及以上)

使用
StackPane
可以随意添加子节点。然后可以使用现有的节点类方法(
toFront();和toBack();


例如,假设直线位于圆的前面,然后调用Circle.toFront();圆圈将出现在前面。

您已经将答案标记为正确,但我认为这会将您引向错误的方向。它可能会解决您当前的问题,但一般来说,不可能总是以这种方式组织形状


詹姆斯已经知道这里到底出了什么问题。这在本

中有详细描述,我可以重新创建它的唯一方法是调用
line.setPickOnBounds(true)。你在什么地方设置了吗?试着颠倒圆和线的加法顺序,你会得到相反的结果。@James_D我没有。你能创建一个重新创建这个的吗?@talex我不能,线的坐标取决于圆的坐标。必须先添加圆圈。嗯,我不认为这会有什么不同,谢谢你的回答,它起作用了!实际上,我甚至不知道
setPickOnBounds():)。好的,我愿意把我的答案改成你的答案,如果你真的给出了答案,而不仅仅是一个链接。