2016-02-19 6 views
3

Я пытаюсь разобраться с различными аспектами обработки событий в Java FX. Я прочитал материал Oracle, но я все еще немного смущен и задаюсь вопросом, может ли кто-нибудь объяснить различия и ключевые варианты использования некоторых из различных вариантов, доступных кратким образом.Java FX - различные аспекты обработки событий

Во-первых, из того, что я вижу, есть обработчики событий и фильтры событий, а затем есть удобные методы. Итак, какова разница между обработчиками и фильтрами и почему я буду использовать один над другим. Кроме того, каковы преимущества добавления обработчика событий с помощью addEventHandler (...) вместо использования метода удобства? Из моего собственного тестирования я считаю, что с помощью addEventHandler (...) вы можете присоединить несколько обработчиков событий к определенному элементу управления, тогда как использование setOnEvent-type (...) позволяет только подключить один обработчик события, поскольку он каждый раз перезаписывает свойство установлено. Любые другие различия?

Здесь есть темы ChangeListener и InvalidationListener. Правильно ли я считаю, что ChangeListener - это тип обработчика событий, специально разработанный для прослушивания событий изменений (свойств)? Кажется, я не могу найти много примеров использования ChangeListener помимо страницы Oracle в свойствах JavaFX и Binding - знает ли кто-нибудь о хорошем руководстве? Кроме того, простыми словами, когда я буду выбирать между ChangeListener и InvalidationListener?

Наконец, можно ли иногда моделировать одну и ту же процедуру обработки событий через традиционный EventHandler или ChangeListener - например, нажатие кнопки может быть обработано с помощью ActionEvent - есть ли способ сделать это через ChangeListener? Я вижу, что теоретически можно добавить слушателя изменений в onActionProperty, но я думаю, что это не будет вызываться при нажатии кнопки, но вместо этого, если setOnAction фактически изменил обработчик событий, который был присоединен?

ответ

3

Так в чем же основное отличие между обработчиками и фильтрами и почему I будет использовать один над другим.

Главное отличие в том, когда каждый происходит. Фильтры событий вызывается во время фазы захвата события, которая возникает до фазы разбухания события (когда вызываются обработчики событий). Следовательно, вы можете фильтровать (потреблять) события, которые вы не хотите обрабатывать, до того, как обработчики будут уведомлены. Большую часть времени вы хотели бы просто использовать обработчик и не беспокоиться о фильтрах. Однако есть случаи, когда вам нужно фильтровать события. Например, представьте себе игру, в которой обработчик мыши перемещает игровой персонаж. Если пользователь открывает меню в игре, вы не хотите, чтобы он мог щелкнуть «через» меню в игре и переместить символ, пока меню открыто. Один из возможных подходов - отфильтровать эти события мыши и уничтожить их до того, как они достигнут узла, на котором зарегистрирован обработчик. Разумеется, вы можете присоединить обработчик мыши к чему-то другому, а не ко всей сцене, но в этом примере это не так.

Удобные погрузчики, как следует из названия, доступны для удобства. Это уменьшает код шаблона и позволяет легко API. Согласно документу JavaFX, они называются последними в цепочке событий. Поэтому, если у вас есть только один тип событий, то эти методы должны быть предпочтительными.

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

Кроме того, простыми словами, когда я могу выбрать между ChangeListener и InvalidationListener?

Сменить прослушиватель уведомляется, когда значение фактически изменилось.Чтобы идентифицировать изменение, значение должно быть пересчитано. Поэтому, когда вы добавляете такого слушателя к наблюдаемому значению, он уже не лениво оценивается, а с нетерпением.

Уведомление о признании недействительным уведомляется, когда значение больше недействительно. Это, однако, не означает, что значение изменилось. Это позволяет нам запускать событие недействительности, не зная значения. Значение будет оцениваться до его доступа.

Таким образом, используйте ChangeListener, если вам нужно знать новое значение наблюдаемого объекта, в противном случае используйте InvalidationListener.

Я вижу, что вы могли бы теоретически добавить изменения слушателя в onActionProperty, но я думаю, что это не будет вызываться, когда кнопка нажата, но вместо этого, если setOnAction фактически изменил обработчик событий, который был прикреплен ?

Да, вы правы. Для обработки нажатия кнопки вам нужно будет использовать setOnAction(). ChangeListener не имеет никакого отношения к обработке событий.

+0

Можете ли вы пояснить - во-первых, правильно ли я говорю, что с помощью setOnAction вы можете присоединить только один обработчик событий к кнопке, тогда как с помощью методов addEventHandler/addListener вы можете добавить много обработчиков или слушателей к узлу/свойству соответственно? Во-вторых, если я просто обсужу принцип «обработки событий» в целом и ссылаюсь на то, как JavaFX справляется с этим, было бы ли законным я сказать, что есть обработчики событий, которые обрабатывают различные события, и ChangeListeners, которые обрабатывать изменения свойств, причем последний является специализированным типом обработчика событий? – Tranquility

+0

1. Да 2. При обращении к JavaFX вы всегда должны делать различие между слушателями и обработчиками событий и называть их такими, какие они есть, так что все, кто знаком с синтаксисом JavaFX, понимают, что вы имеете в виду. Однако, вообще говоря, ваша концепция верна. Как слушатели, так и обработчики событий являются, по сути, функциями обратного вызова. С этой точки зрения прослушиватель изменений можно рассматривать как обработчик события «change», в то время как обработчик события мыши можно рассматривать как слушателя событий «мыши». – AlmasB

 Смежные вопросы

  • Нет связанных вопросов^_^