0

我里面有一个StackPane和一个Group。Group 具有实际的视觉内容,用户可以平移和缩放。该组具有坐标变换。

我希望鼠标和滚动事件的行为相同,即使它们发生在组之外(因为它已被缩小或因为组图形中的孔)。

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

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

现在我正在考虑在 StackPane 和 Group 中都有处理程序,然后传递给 Group 内的坐标校正的单独方法。有效,但是是否存在我没​​有意识到的更简洁的机制?

4

2 回答 2

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 语言。

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

于 2013-01-08T13:30:31.943 回答
0

只是我的两分钱:我在 JavaFx 8 中遇到了同样的问题,我通过用窗格替换我的组来解决它。没有做任何改变,它就像一个魅力。知道可能有用。

于 2013-10-21T17:05:51.150 回答