2013-01-07 138 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中遇到了同樣的問題,我通過將窗格替換爲窗格來解決此問題。沒有做任何改變,它像一個魅力。可能有用的知道。