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中)。所以它不是一个防弹装置,但会用到一定的坐标大小。