Реализация EventHandler
Изучая книгу познакомился с обработчиком событий EventHandler, но мне не понравился предложенный в книге способ его привязывания к объектам в виде:
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {. . .} });
Работая со swing мне кажется удобнее создавать внутренний класс в виде наследника ActionListener с переопределением метода внутри него и предоставлением его когда нужно.
Попытался провернуть это же с EventHandler, но запутался с дженериками(скорее всего) и не совсем понимаю в чем проблема созданного мной наследника. Один из вариантов кода который пытался сделать:
private class btnHandler<E extends Event> implements EventHandler<E extends Event> {
@Override
public void handle(E eventObj) {
System.out.println("Haha");
}
}
Основная проблема в ошибке говорящей что я не переопределил метод интерфейса, хотя видно что handle переопределен.
Получилось чтобы запустился такой образец:
private class btnHandler<T> implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent eventObj) {
System.out.println("Haha");
}
}
Но я не совсем понимаю в чем причина неработоспособности первого образца и тем более хочу понять как сделать наследника способного принимать сразу несколько типов ивентов, а не только ActionEvent, например.
Еще нашел вариант создавать EventHandler привязанный к ссылке и так же предоставлять его куда надо, но все же вопросы возникшие выше оставлять без внимания кажется грубой ошибкой.
Весь код класса:
import javafx.application.Application;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.event.*;
import javafx.scene.paint.*;
public class JavaFXApplication extends Application {
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage mainStage) {
mainStage.setTitle("Тест GUI-компонентов");
Group root = new Group();
Scene scene = new Scene (root,400,300,Color.LIGHTGREEN);
Button btn = new Button("Тестировать свойства");
btn.setLayoutX(20);
btn.setLayoutY(20);
btn.setOnAction(new btnHandler<ActionEvent>());
mainStage.setScene(scene);
mainStage.show();
}
private class btnHandler<T> implements EventHandler<T extends Event> {
@Override
public void handle(T eventObj) {
System.out.println("Haha");
}
}
}
Ответы (1 шт):
У вас проблема с дженериками(это довольно сложный для понимания , но одновременно очень мощный механизм, посему уделите ему внимание), именно из-за некорректно написанных дженериков ваш код не компилируется. Код исправил. Альтернативный (более простой) вариант, основанный на лямбдах, также добавил и закомментировал. С последним очень рекомендую разобраться, поскольку джава 8 появилась довольно давно, посему в настоящее время функционального кода написано достаточно много, что делает его понимание ультимативным для любого джава-разработчика. Удачи
import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class JavaFXApplication extends Application {
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage mainStage) {
mainStage.setTitle("Тест GUI-компонентов");
Group root = new Group();
Scene scene = new Scene(root, 400, 300, Color.LIGHTGREEN);
Button btn = new Button("Тестировать свойства");
btn.setLayoutX(20);
btn.setLayoutY(20);
//btn.setOnAction(e -> System.out.println("Haha"));
btn.setOnAction(new BtnHandler<>());
mainStage.setScene(scene);
mainStage.show();
}
private class BtnHandler<T extends Event> implements EventHandler<T> {
@Override
public void handle(T eventObj) {
System.out.println("Haha");
}
}
}