【问题标题】:Javafx one eventhandler to catch them all?Javafx 一个事件处理程序来捕获它们?
【发布时间】:2020-06-24 19:08:39
【问题描述】:

我正在玩 javafx 并尝试将 EventHandler 或 EventFilter(现在不完全确定有什么区别)添加到我的一个场景中。它应该只检测任何输入,从鼠标点击到按键。

我能够为鼠标点击编写一个 EventFilter,但我不能让它在一般情况下为任何事件工作。

我目前的想法如下:

        scene.addEventFilter(Event.ANY, new EventHandler<InputEvent>() {
            @Override
            public void handle(InputEvent event) {
                System.out.println("Event detected! " + event.getSource());
            }
        });

但是有了这个,我得到 addEventFilter 以红色突出显示,并显示如下错误消息:

The method addEventFilter(EventType<T>, EventHandler<? super T>) in the type Scene is not applicable for the arguments (EventType<Event>, new EventHandler<InputEvent>(){})

我是 Java 新手,不知道该怎么做。我想捕捉场景中的输入事件,但不需要为每个可能的事件设置单独的过滤器。

【问题讨论】:

  • "添加一个 EventHandler 或 EventFilter(现在不完全确定有什么区别)" – 查看this tutorial

标签: java events javafx eventhandler eventfilter


【解决方案1】:

方法签名,如错误信息所示,是

addEventFilter(EventType<T>, EventHandler<? super T>) 

由于Event.ANYEventType&lt;Event&gt;,因此您需要EventHandler&lt;T&gt;,其中TEventEvent 的超类。即

scene.addEventFilter(Event.ANY, new EventHandler<Event>() {
    @Override
    public void handle(Event event) {
        System.out.println("Event detected! " + event.getSource());
    }
});

或者,如果您只想捕获InputEvents,请注意InputEvent.ANYEventType&lt;InputEvent&gt;,所以在这种情况下您可以这样做

scene.addEventFilter(InputEvent.ANY, new EventHandler<InputEvent>() {
    @Override
    public void handle(InputEvent event) {
        System.out.println("Event detected! " + event.getSource());
    }
});

在更现代的语法中,这些只是

scene.addEventFilter(InputEvent.ANY,  
        event -> System.out.println("Event detected! " + event.getSource())
);

(或相同,将InputEvent.ANY 替换为Event.ANY)。

请注意,在后一个版本中,所有类型都是自动推断的,因此您基本上回避了犯该错误的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多