Javafx один обработчик событий, чтобы поймать их все?

Я играю с 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 и не понимаю, что делать. Я хотел перехватывать входные события в своей сцене, но без необходимости иметь отдельный фильтр для каждого возможного события.


person Franz    schedule 24.06.2020    source источник
comment
добавьте EventHandler или EventFilter (сейчас не совсем уверен, в чем разница) – посмотрите это руководство.   -  person Slaw    schedule 25.06.2020


Ответы (1)


Сигнатура метода, как показано в сообщении об ошибке,

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

Поскольку Event.ANY является EventType<Event>, вам нужно EventHandler<T>, где T либо Event, либо надкласс Event. т.е.

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

В качестве альтернативы, если вы хотите захватить только InputEvent, обратите внимание, что InputEvent.ANY является EventType<InputEvent>, поэтому в этом случае вы можете сделать

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).

Обратите внимание, что в этой последней версии все типы выводятся автоматически, поэтому вы, по сути, избегаете возможности совершения этой ошибки.

person James_D    schedule 24.06.2020