2013-01-07 114 views
0

我有一个StackPane和一个Group在它内。本集团拥有实际的视觉内容,并可由用户进行平移和缩放。本集团进行协调转型。传递鼠标和滚动事件从父母回到孩子(在JavaFX)

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

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

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

现在我正在考虑在StackPane和Group中都有处理程序,并传递给组中的坐标校正单独方法。工程,但会存在一个我没有意识到的整洁机制?

+0

[group.setMouseTransparent(true)](http://docs.oracle.com/javafx/2/api/javafx/scene/Node.html#setMouseTransparent(boolean))有帮助吗? – jewelsea

+0

我不知道玻璃板解决方案为什么不起作用。我们在各地的应用程序中使用glasspanes,它们工作得很好。请注意,我们将它们放在组的前面,而不是后面,并手动翻译所有坐标并将它们转发给相关的部分。 – Sebastian

+0

我不知道“glasspane”。这是JavaFX 2.x--你可以分享一些更多的信息(但也可以参考下面的解决方法)。谢谢。 – akauppi

回答

0

我解决这个问题的方法:

Group构造我设立了其父处理程序:

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

    ..some local var's here.. 

    pv.onMousePressed = (ev: MouseEvent) => if (ev.primaryButtonDown) { 
    ... 

runLater负责该集团并不需要连接到它的父(或者将潜在的父对象作为构造函数参数给予)。一旦runLater-block被执行,父母身份就建立起来了。

我觉得这是一个相当整洁的方法。它允许所有的事件处理在集团内部,但仍然使用父母的较大的房地产。没有代码需要在两个地方。坐标变换总是相同的,因为它是被调用的父类事件(不是组)。

我正在使用Scala,但同样的方法应该可以在任何JVM语言中工作。

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

0

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