Javafx 2 将鼠标和滚动事件从父对象传递回子对象(在JavaFX中)

Javafx 2 将鼠标和滚动事件从父对象传递回子对象(在JavaFX中),javafx-2,Javafx 2,我有一个堆栈窗格和一个组。该组具有实际的视觉内容,用户可以对其进行平移和缩放。该组具有坐标变换 我希望鼠标和滚动事件的行为相同,即使它们发生在组外(要么是因为它被缩小了,要么是因为组图形中有洞) 我无法直接从StackPane转发(鼠标)事件,因为坐标系不同 我尝试在组后面放置一个大的透明矩形,但这会导致图形系统纹理大小溢出(=不好) 现在我考虑在StackPane和组中都使用处理程序,在组中传递一个单独的方法。有效,但是否存在我尚未意识到的更整洁的机制?我解决这个问题的方法: 在组构造函数中,

我有一个
堆栈窗格
和一个
。该组具有实际的视觉内容,用户可以对其进行平移和缩放。该组具有坐标变换

我希望鼠标和滚动事件的行为相同,即使它们发生在组外(要么是因为它被缩小了,要么是因为组图形中有洞)

我无法直接从StackPane转发(鼠标)事件,因为坐标系不同

我尝试在组后面放置一个大的透明矩形,但这会导致图形系统纹理大小溢出(=不好)

现在我考虑在StackPane和组中都使用处理程序,在组中传递一个单独的方法。有效,但是否存在我尚未意识到的更整洁的机制?

我解决这个问题的方法:

构造函数中,我为其父级设置了处理程序:

runLater {   
  val pv= parent.value
  assert( pv != null )

  ..some local var's here..

  pv.onMousePressed = (ev: MouseEvent) => if (ev.primaryButtonDown) {
  ...
runLater
注意不需要将组附加到其父级(或将潜在父级的句柄作为构造函数参数)。一旦执行了runLater块,就建立了父关系

我觉得这是一个相当巧妙的方法。它允许所有事件处理都在组内进行,但仍利用母公司较大的不动产。代码不需要在两个位置。坐标变换总是相同的,因为调用的是父对象的事件(而不是组的)

我使用的是Scala,但在任何JVM语言中都应该使用相同的方法


注意:以
if开头的处理程序不会在当前ScalaFX中编译。这是ScalaFX的一个小故障,可以很容易地修复(请咨询我的详细信息)。

就我的两分钱:我在JavaFX8中遇到了同样的问题,我用一个窗格替换了我的组,从而解决了这个问题。没有改变,它就像一个符咒。知道可能有用。

有用吗?我不知道为什么glasspane解决方案不起作用。我们在各地的应用程序中都使用玻璃材质窗格玻璃,它们工作得很好。请注意,我们将它们放在组的前面,而不是后面,手动转换所有坐标并将它们转发到相关的部分。我不知道“玻璃窗格”是什么。这是javafx2.x-你可以分享更多关于这个的信息吗(但也可以看看我解决这个问题的方法,如下所示)。谢谢。玻璃窗格是UI编程中的一个概念。看看这里:@Sebastian glasspane的问题是(尽管它是透明的)JavaFX以某种方式使它成为一种纹理,并且纹理有大小限制(我猜是在GPU中)。所以它不是一个防弹装置,但会用到一定的坐标大小。