如何在JavaFX中的stackpane上将事件发送给兄弟

时间:2015-04-16 22:42:53

标签: java webview javafx event-handling javafx-webengine

我正在努力使用JavaFX StackPane事件处理。

当我将鼠标移到我的堆栈窗格上时,会调用MapController.onMouseMoved(),这对我来说很明显。

网页上有应该处理onmousemove事件的脚本。当我的WebView位于StackPane的顶部或者放在WebView上的窗格是mouseTransparent时,该脚本可以正常工作。当事件目标是我的WebView时就是这种情况。

我的问题:
当事件目标是我的Pane时,我需要处理fxml片段中的情况。我还需要重新发送鼠标移动事件给兄弟WebView,以便在网页中执行脚本。换句话说,我想从WebView中触发另一个鼠标事件。请回复基于以下fxml片段的经过验证的示例。

<StackPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="foo.bar.MapController">
    <WebView fx:id="m_projectsWebView" prefHeight="600.0" prefWidth="800.0"/>
    <Pane fx:id="m_devicesLayer" onMouseMoved="#onMouseMoved"/>
</StackPane>

1 个答案:

答案 0 :(得分:2)

前一段时间我找到了一个解决方案,下面是那些面临类似问题的代码片段。

/** redirect events to a sibling node (m_projectsWebView) */
    m_devicesLayer.addEventHandler(Event.ANY, event -> {
        if (!(event instanceof MouseEvent) {
            m_projectsWebView.fireEvent(event.copyFor(m_projectsWebView, m_projectsWebView));
        }
        event.consume();
    });

我只是截取我的Pane级别的所有事件,然后我为其兄弟(WebView)创建副本,然后我使用原始事件来阻止它传播。

处理属于Pane的组件的所有必需事件,我的WebView也会收到所需的事件。