【问题标题】:Why is the Circle hidden behind the Line?为什么圆圈隐藏在线条后面?
【发布时间】:2016-10-27 16:10:49
【问题描述】:

是的,标题看起来像是在开玩笑,但其实不是。

问题

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

圆圈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 添加到主窗格中。

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

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

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

【问题讨论】:

  • 我可以重新创建的唯一方法是调用line.setPickOnBounds(true);。你在什么地方有那个设置吗?
  • 尝试颠倒添加圆和线的顺序,你会得到相反的行为。
  • @James_D 我没有。
  • 你能创建一个minimal reproducible example 来重新创建它吗?
  • @talex 我不能,线的坐标取决于圆的坐标。必须先添加圆圈。

标签: java javafx geometry


【解决方案1】:

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

James_D 已经提到了这里真正出了什么问题。这在post中有详细描述

【讨论】:

  • 其实我什至不知道setPickOnBounds(); :)。
  • 好的,如果你真的给出了答案,而不仅仅是一个链接,我愿意将我的答案改为你的答案。
【解决方案2】:

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

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

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

1)如果您使用的是Canvas,请选择先绘制哪个。Circle 还是Line

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

3 及以上)

使用StackPane,你可以随意添加子元素。然后你可以使用已经存在的Node类方法(toFront(); and toBack();)

例如假设 Line 在 Circle 的前面,然后调用 Circle.toFront();圆圈会出现在前面。

【讨论】:

  • 好吧,我认为这不会有什么不同,感谢您的回答,它奏效了!
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多