Практически во всех примерах, которые я мог бы найти, обработчики JavaFX событий создаются как анонимные внутренние классы, так:Использовать существующий метод в качестве обработчика событий JavaFX
button.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (event.getClickCount()>1) {
System.out.println("double clicked!");
}
}
});
Но я действительно ненавижу анонимные внутренние классы (некрасиво! !!), и я также не хочу создавать отдельные классы для каждого обработчика событий. Я бы хотел использовать существующие методы как обработчики событий, как это делает FXMLLoader. Моя первая мысль была использовать отражение и дженерики, и это то, что я придумал:
public final static <E extends Event> EventHandler<E> createEventHandler(
final Class<E> eventClass, final Object handlerInstance, final String handlerMethod) {
try {
final Method method = handlerInstance.getClass().getMethod(handlerMethod, eventClass);
return new EventHandler<E>() {
@Override
public void handle(E event) {
try {
method.invoke(handlerInstance, event);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
}
};
} catch (NoSuchMethodException | SecurityException e) {
return null;
}
}
Вы пройти необходимый класс Event, экземпляр обработчика и имя метода, который будет обрабатывать событие, и требуется EventHandler возвращается. Он работает, но выглядит не очень элегантно. Кто-нибудь имеет лучшую идею?
Я хотел бы добавить, что в JDK8 вы можете использовать ссылки на методы, поэтому дать метод называется «myEventHandler (MouseEvent)», вы можете написать button.setOnMouseClicked (this :: myEventHandler) – tomsontom
Очень информативно, но в основном это говорит мне что я не могу сделать намного лучше, чем мое существующее решение. FXMLLoader, по-видимому, делает то же самое (получает дескриптор метода и вызывает его через отражение). В качестве побочного примечания я не понимаю, почему многие люди рекомендуют JDK8 и JavaFX8, которые пока не являются официальными и не являются кандидатами на что-либо, кроме тестирования. –
Что касается использования java8/javafx8, хотя он еще официально не выпущен ... он добавляет много функций, которые люди долго ждали. Я выбрал javafx8 так, как будто это бета/ранний доступ, было гораздо проще в использовании, чем качели, а введение лямбда и потоков было слишком заманчивым. Фактический выпуск java8 намечен на март, поэтому на самом деле все работает очень хорошо с незначительными ошибками в основном на сторонних инструментах. – chooks