Шрифт:
Интервал:
Закладка:
Модель событий
Все узлы графа сцены могут выступать в качестве цели событий за счет реализации интерфейса EventTarget.
События используются для уведомления вашего приложения о действиях, предпринятых пользователем, и позволяют приложению реагировать на событие.
И все события платформы JavaFX представлены подклассами базового класса Event.
Это события действий, события ввода данных пользователем, события редактирования.
JavaFX-события характеризуются источником события, целью события и типом события.
Как правило, источником события и целью события служит один и тот же JavaFX-компонент. Однако статический метод fireEvent класса Event позволяет послать событие определенной цели события.
В этом примере, при нажатии кнопки btn1 срабатывает обработчик событий кнопки btn2.
Так как в обработчике кнопки btn1 мы посылаем событие методом fireEvent другой кнопке.
Также цель события можно определить за счет создания цепочки доставки события, представленной объектом EventDispatchChain.
За создание цепочки доставки события JavaFX-компонента отвечает метод buildEventDispatchChain класса Node, возвращающий объект EventDispatchChain.
Методы append и prepend интерфейса EventDispatchChain позволяют добавить объект EventDispatcher в конец и в начало исходной цепочки доставки события, а метод dispatchEvent интерфейса EventDispatchChain обеспечивает доставку определенного события JavaFX-компоненту.
Объект EventDispatcher является реализацией интерфейса EventDispatcher, который имеет единственный метод dispatchEvent, отвечающий за дальнейшую передачу события через цепочку доставки с возможностью его обработки, модификации, замены или отклонения, где event – это передаваемое событие, а tail – остаток цепочки доставки.
Этот пример демонстрирует регистрацию цепочки доставки события для кнопки Button с последующей доставкой события кнопке при щелчке мышкой на сцене Scene.
С помощью метода setEventDispatcher класса Node можно определить пользовательский EventDispatcher-объект для JavaFX-компонента.
В этом примере, при нажатии кнопки btn1 также срабатывает обработчик событий кнопки btn2.
Каждый объект EventDispatcher в цепочке EventDispatchChain отвечает за пересылку события в остальную часть цепочки во время диспетчеризации событий.
В пользовательском объекте EventDispatcher для кнопки btn1 мы отправляем событие другой кнопке.
Процесс доставки события через цепочку доставки EventDispatchChain разделяется на две фазы.
Первая фаза называется фазой захвата (capturing phase) и состоит из передачи события от корневого узла к узлу цели события, от первого элемента цепочки EventDispatchChain, связанной с целью события, до ее последнего элемента.
Вторая фаза – восходящая фаза (bubbling phase) заключается в противоположном движении события от узла цели события к корневому узлу цепочки доставки.
Когда происходит некое действие, система определяет, какой узел является целью события.
После того, как узел графа сцены выбран как цель события, маршрут события или цепочка доставки события EventDispatchChain устанавливается реализацией по умолчанию метода buildEventDispatchChain интерфейса EventTarget в классе Node.
На этапе захвата события событие отправляется корневым узлом приложения по цепочке доставки события целевому узлу.
На этом этапе происходит обработка события фильтрами события.
Если какой-либо узел в цепочке имеет фильтр событий, зарегистрированный для типа произошедшего события, вызывается этот фильтр.
Когда фильтр завершает свою работу, событие передается следующему узлу по цепочке.
Фильтр регистрируется методом addEventFilter класса Node.
После того, как цель события достигнута, событие возвращается по цепочке обратно от цели к корневому узлу.
На этом этапе происходит обработка события обработчиками события.
Если какой-либо узел в цепочке имеет обработчик, зарегистрированный для типа принимаемого события, вызывается этот обработчик.
Когда обработчик завершает свою работу, событие возвращается на следующий узел вверх по цепочке.
Обработчик регистрируется методом addEventHandler класса Node.
Тип события, представленный классом EventType, определяет характеристику события.
Или другими словами, типы события дополнительно классифицируют события одного класса событий, например, KEY_PRESSED, KEY_RELEASED или KEY_TYPED.
При этом типы событий образуют иерархическую структуру с корневым типом ANY.
Имя типа события для Event-объекта можно получить методом getEventType.getName.
Обрабатывать события JavaFX-компоненты могут, используя широкий набор методов, которым в качестве аргумента передается объект EventHandler.
Это могут быть или фильтры, или обработчики событий.
Объект EventHandler создается с помощью реализации интерфейса EventHandler, переопределяя его метод handle, в котором и обрабатывается событие.
На любом этапе доставки события цепочку можно прервать, поглотив событие.
Для этого в методе handle нужно вызвать метод consume для объекта события.
Hyperlink и Label
После того, как мы разобрали общие вопросы, связанные со свойствами компонентов и обработкой событий, вернемся к элементам управления интерфейса пользователя.
Компонент Hyperlink используется для форматирования текста в виде гиперссылки.
Компонент Hyperlink создается с помощью конструктора, в котором можно указать текст и изображение гиперссылки.
Отличие набора свойств компонента Hyperlink от набора свойств компонента Button заключается в наличии свойства visited, которое принимает значение true при активации гиперссылки.
Основная задача, которая стоит при применении компонента Hyperlink – это создание привлекательного общего внешнего вида гиперссылки и его изменение в зависимости от того нажата ли гиперссылка или нет, была ли она уже активирована или нет, а также обработка активации гиперссылки.
По умолчанию гиперссылка отображается синим цветом с пунктирной рамкой вокруг гиперссылки.
При вводе курсора мышки, гиперссылка становится подчеркнутой, а при нажатии ее цвет меняется на черный.
Для того чтобы убрать рамку, можно использовать CSS свойство -fx-border-width.
Для того чтобы сделать гиперссылку подчеркнутой, можно использовать метод setUnderline (true).
Чтобы изменить внешний вид гиперссылки при наведении курсора мыши и нажатии, можно использовать обработчики событий OnMouseEntered, OnMousePressed и OnMouseExited.
Сама функциональность гиперссылки определяется в обработчике события действия OnAction.
Здесь можно запустить браузер WebView или же можно полностью обновить сцену.
Компонент Label обеспечивает отображение текстовой подписи, изображения, текстовой подписи и изображения.
Этот компонент создается с помощью конструктора, в котором можно указать текст подписи и изображение.
Цвет текста можно установить методом setTextFill.
Шрифт можно установить методом setFont.
И перенос текста на новую строку можно установить методом setWrapText (true).
Методом setContentDisplay можно установить расположение изображения относительно текста.
Кнопка ToggleButton и RadioButton
Компонент ToggleButton представляет кнопку, которая может находиться в нажатом и отжатом состояниях.
Кнопка ToggleButton может быть создана с помощью конструктора, в котором можно указать надпись кнопки и ее изображение.
Отличие набора свойств компонента ToggleButton от набора свойств компонента Button заключается в наличии свойств selected и toggleGroup.
Свойство selected принимает значение true, если кнопка ToggleButton находится в нажатом состоянии, и значение false – если кнопка ToggleButton отжата.
Свойство toggleGroup указывает группу ToggleGroup, к которой принадлежит кнопка ToggleButton.
Объединение кнопок ToggleButton в группу ToggleGroup отличается от объединения кнопок RadioButton в группу ToggleGroup – в группе кнопок RadioButton по меньшей мере одна кнопка должна находиться в выбранном состоянии.
В группе кнопок ToggleButton такой функциональности нет.
Объединение кнопок ToggleButton в группу обеспечивает эффект нажатия только единственной кнопки в группе.
При нажатии
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- Как спроектировать современный сайт - Чои Вин - Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование
- Программирование на Java - Н.А. Вязовик - Программирование
- ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ. РУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ - ГОССТАНДАРТ РОССИИ - Программирование
- Каждому проекту своя методология - Алистэр Коуберн - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Как почистить сканы книг и сделать книгу - IvanStorogev? KpNemo - Программирование