我的挑战是以下情况:
我想在整个应用程序上添加一个不可见(不透明度 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);