我内有StackPane
和Group
。本集团拥有实际的视觉内容,可由用户进行平移和缩放。该小组进行了坐标转换。
我希望鼠标和滚动事件的行为相同,即使它们发生在组外(因为它已被缩小或由于组图形中的漏洞)。
我不能直接从StackPane转发(鼠标)事件,因为坐标系不同。
我尝试在组后面放置一个宏大的透明矩形,但这会导致图形系统纹理大小溢出(=不好)。
现在我正在考虑在StackPane和Group中都有处理程序,并在Group中传递协调校正的单独方法。工作,但是有没有我没有意识到的更整洁的机制?
答案 0 :(得分:0)
我解决这个问题的方式:
在Group
构造函数中,我为其父级设置了处理程序:
runLater {
val pv= parent.value
assert( pv != null )
..some local var's here..
pv.onMousePressed = (ev: MouseEvent) => if (ev.primaryButtonDown) {
...
runLater
注意不需要将Group附加到其父级(或者将潜在的父级句柄作为构造函数参数)。一旦runLater-block被执行,就会建立父母身份。
我发现这是一个相当简洁的方法。它允许所有事件处理在集团内,但仍然使用父母的更大的房地产。没有代码需要在两个地方。坐标转换始终是相同的,因为它是被调用的父事件(而不是组的)。
我正在使用Scala,但同样的方法应该适用于任何JVM语言。
注意:使用if
开始处理程序不会在当前的ScalaFX中编译。这是ScalaFX的一个小故障,可以很容易地修复(问我详细信息)。
答案 1 :(得分:0)
只是我的两分钱:我在JavaFx 8中遇到了同样的问题,我通过用一个窗格替换我的Group来解决它。没有做任何改变,它就像一个魅力。知道可能有用。