JavaFX:实现类似glasspane的鼠标/触摸事件接收器的最佳实践,它将事件转发到底层控件

时间:2013-09-12 08:07:24

标签: events javafx glasspane

我面临的挑战是:

我想在整个应用程序上添加一个不可见(不透明度0)窗格,它接收所有鼠标和触摸事件。当事件发生时,它会重置某种活动计时器。

我的第一个方法(没有这样的窗格)是将监听器添加到根窗格,这非常有效。但是......按钮会消耗所有事件,因此计时器不会被重置。

在我看来,玻璃板解决方案将是一个更好的解决方案,但我无法找到将接收到的鼠标和触摸事件转发到底层控件的解决方案。

简而言之:窗格拦截鼠标事件(触发器重置计时器),并点击基础按钮。

有什么想法吗?

编辑第一个解决方案 我来到解决方案中将EventDispatcher添加到我的根窗格,该窗格会触发自定义事件,例如,按下鼠标。所以没有玻璃板,但它有效:

    //this == myRootPane
    final EventDispatcher originalDispatcher = this.getEventDispatcher();

    EventDispatcher dispatcher = new EventDispatcher() {

        @Override
        public Event dispatchEvent(Event event, EventDispatchChain tail) {
            if(timeoutResetEventHdlr != null) {
                if(event instanceof MouseEvent) {
                    if(event.getEventType().equals(MouseEvent.MOUSE_PRESSED)) {
                        timeoutResetEventHdlr.handle(new PageTimeoutResetEvent());
                    }
                }

            }
            originalDispatcher.dispatchEvent(event, tail);
            return event;
        }
    };

    this.setEventDispatcher(dispatcher);

1 个答案:

答案 0 :(得分:1)

不要使用玻璃窗格或事件调度员周围的粪便,使用event filter上的scene

过滤器在event capturing phase, rather than the event bubbling phase中触发,因此您可以拦截事件并在基础控件消耗事件之前对其执行某些操作。