0

我的挑战是以下情况:

我想在整个应用程序上添加一个不可见(不透明度 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);
4

1 回答 1

1

不要在事件调度程序中使用玻璃窗格或乱七八糟,在场景中使用事件过滤器

过滤器在事件捕获阶段触发,而不是在事件冒泡阶段触发,因此您可以在底层控件使用事件之前拦截事件并对其执行一些操作。

于 2013-09-12T10:17:34.033 回答