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

Events JavaFX:实现类似glasspane的鼠标/触摸事件接收器的最佳实践,它将事件转发给底层控件,events,javafx,glasspane,Events,Javafx,Glasspane,我的挑战是以下情况: 我想在整个应用程序上添加一个不可见(不透明度0)窗格,它接收所有鼠标和触摸事件。当事件发生时,它会重置某种活动计时器 我的第一种方法(没有这样的窗格)是将侦听器添加到根窗格,这非常有效。但是按钮消耗所有事件,因此计时器不会重置 在我看来,glasspane解决方案将是一个更好的解决方案,但我找不到将接收到的鼠标和触摸事件转发到底层控件的解决方案 简言之:窗格截取鼠标事件(触发器重置计时器),并单击底层按钮 有什么想法吗 编辑第一个解决方案 我找到了将EventDispatc

我的挑战是以下情况:

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

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

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

简言之:窗格截取鼠标事件(触发器重置计时器),并单击底层按钮

有什么想法吗

编辑第一个解决方案 我找到了将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);

不要在事件调度器周围使用玻璃窗格或垃圾,请在屏幕上使用


过滤器在中触发,因此您可以拦截事件并在底层控件使用事件之前对其采取一些操作。

非常感谢您提供的指导!更好(且正确)的代码。
this.scene.addEventFilter(MouseEvent.MOUSE_按下,neweventhandler(){@Override public void handle(MouseEvent event){resetTimeout();}})