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