为什么圆圈隐藏在线后?

时间:2016-10-27 16:10:49

标签: java javafx geometry

是的,标题看起来像是一个笑话的设置但却不是。

问题

我正在使用JavaFX编写程序。我在窗格中添加了一些绘图(标准线,圆,矩形等来自javafx.scene.shape)。我在某些圆圈上设置了onMouseEnter()来改变颜色。这很有效,除非我在下图中放置一条线:

Connector bug

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);

在TransistorWidget.java中:

ConnectorWidget base = new ConnectorWidget(...);
getChildren().add(base);

在WireWidget中:

Line line = new Line(...);
getChildren().add(line);

点击后,可以在主窗格中添加新的TransisorWidget

点击WireWidget后点击另一个ConnectorWidget,即可在主窗格中创建新的ConnectorWidget

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

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

2 个答案:

答案 0 :(得分:2)

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

James_D已经提到了这里真正出错的地方。这在post

中有详细描述

答案 1 :(得分:1)

显然,这与Node覆盖另一个Node的事实有关。

想象一下,您使用StackPane作为Layout.Adding首先是Circle,然后是Line,如果该行包含Circle已经执行的某些像素,那么Circle的某些部分{1}}将无法显示。

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

1)如果您使用的是Canvas,请选择首先绘制的内容。CircleLine

2)如果您使用某种布局,则可以使用getChilder.add/addAll方法进行播放。因此,您首先将Circle然后Line作为子项添加到布局中。

3并且更好)

使用StackPane您可以随意添加子项。然后您可以使用现有的Node类方法(toFront(); and toBack();

例如,想象一下Line在Circle的前面,然后调用Circle.toFront();圆圈将出现在前面。