В JavaFX мы можем разрабатывать приложения с графическим интерфейсом, веб-приложения и графические приложения. В таких приложениях всякий раз, когда пользователь взаимодействует с приложением (узлами), говорят, что произошло событие.
Например, нажатие кнопки, перемещение мыши, ввод символа с клавиатуры, выбор элемента из списка, прокрутка страницы — действия, которые вызывают событие.
Типы событий
События могут быть широко классифицированы в следующие две категории —
-
События переднего плана — те события, которые требуют непосредственного взаимодействия с пользователем. Они генерируются как последствия взаимодействия человека с графическими компонентами в графическом интерфейсе пользователя. Например, нажатие кнопки, перемещение мыши, ввод символа с клавиатуры, выбор элемента из списка, прокрутка страницы и т. Д.
-
Фоновые события — те события, которые требуют взаимодействия конечного пользователя, называются фоновыми событиями. Сбои операционной системы, аппаратный или программный сбой, истечение таймера, завершение работы — это примеры фоновых событий.
События переднего плана — те события, которые требуют непосредственного взаимодействия с пользователем. Они генерируются как последствия взаимодействия человека с графическими компонентами в графическом интерфейсе пользователя. Например, нажатие кнопки, перемещение мыши, ввод символа с клавиатуры, выбор элемента из списка, прокрутка страницы и т. Д.
Фоновые события — те события, которые требуют взаимодействия конечного пользователя, называются фоновыми событиями. Сбои операционной системы, аппаратный или программный сбой, истечение таймера, завершение работы — это примеры фоновых событий.
События в JavaFX
JavaFX обеспечивает поддержку для обработки самых разных событий. Класс с именем Event пакета javafx.event является базовым классом для события.
Экземпляр любого его подкласса является событием. JavaFX предоставляет широкий спектр событий. Некоторые из них перечислены ниже.
-
Событие мыши — это событие ввода, которое происходит при нажатии мыши. Он представлен классом MouseEvent . Он включает в себя такие действия, как нажатие мыши, нажатие мыши, отпускание мыши, перемещение мыши, цель, введенная мышью, цель, покинутая мышью и т. Д.
-
Key Event (Событие ключа). Это событие ввода, которое указывает, что нажатие клавиши произошло на узле. Он представлен классом с именем KeyEvent . Это событие включает в себя такие действия, как нажатие клавиши, отпускание клавиши и ввод ключа.
-
Drag Event — это событие ввода, которое происходит при перетаскивании мыши. Он представлен классом с именем DragEvent . Он включает в себя такие действия, как перетаскивание, перетаскивание, перетаскивание введенной цели, перетаскивание покинутой цели, перетаскивание и т.д.
-
Событие окна — это событие, связанное с отображением / скрытием действий окна. Он представлен классом с именем WindowEvent . Он включает в себя такие действия, как скрытие окна, показ окна, скрытие окна, показ окна и т. Д.
Событие мыши — это событие ввода, которое происходит при нажатии мыши. Он представлен классом MouseEvent . Он включает в себя такие действия, как нажатие мыши, нажатие мыши, отпускание мыши, перемещение мыши, цель, введенная мышью, цель, покинутая мышью и т. Д.
Key Event (Событие ключа). Это событие ввода, которое указывает, что нажатие клавиши произошло на узле. Он представлен классом с именем KeyEvent . Это событие включает в себя такие действия, как нажатие клавиши, отпускание клавиши и ввод ключа.
Drag Event — это событие ввода, которое происходит при перетаскивании мыши. Он представлен классом с именем DragEvent . Он включает в себя такие действия, как перетаскивание, перетаскивание, перетаскивание введенной цели, перетаскивание покинутой цели, перетаскивание и т.д.
Событие окна — это событие, связанное с отображением / скрытием действий окна. Он представлен классом с именем WindowEvent . Он включает в себя такие действия, как скрытие окна, показ окна, скрытие окна, показ окна и т. Д.
Обработка событий
Обработка событий — это механизм, который контролирует событие и решает, что должно произойти, если событие произойдет. Этот механизм имеет код, который известен как обработчик событий, который выполняется, когда происходит событие.
JavaFX предоставляет обработчики и фильтры для обработки событий. В JavaFX каждое событие имеет —
-
Цель — узел, на котором произошло событие. Целью может быть окно, сцена и узел.
-
Источник — источник, из которого генерируется событие, будет источником события. В приведенном выше сценарии мышь является источником события.
-
Тип — тип произошедшего события; в случае события мыши — нажатие мыши, отпускание мыши — это тип событий.
Цель — узел, на котором произошло событие. Целью может быть окно, сцена и узел.
Источник — источник, из которого генерируется событие, будет источником события. В приведенном выше сценарии мышь является источником события.
Тип — тип произошедшего события; в случае события мыши — нажатие мыши, отпускание мыши — это тип событий.
Предположим, что у нас есть приложение, в которое вставлены кнопки «Круг», «Стоп» и «Воспроизведение» с использованием группового объекта следующим образом:
Если вы нажмете кнопку воспроизведения, источником будет мышь, целевым узлом будет кнопка воспроизведения, а тип генерируемого события — щелчок мыши.
Этапы обработки событий в JavaFX
Всякий раз, когда генерируется событие, JavaFX проходит следующие фазы.
Строительство маршрута
Всякий раз, когда генерируется событие, по умолчанию / начальный маршрут события определяется построением цепочки отправки событий . Это путь от сцены к исходному узлу.
Ниже приведена цепочка отправки события для сгенерированного события, когда мы нажимаем кнопку воспроизведения в приведенном выше сценарии.
Этап захвата событий
После построения цепочки отправки событий корневой узел приложения отправляет событие. Это событие распространяется на все узлы в цепочке диспетчеризации (сверху вниз). Если какой-либо из этих узлов имеет фильтр, зарегистрированный для сгенерированного события, он будет выполнен. Если ни один из узлов в цепочке диспетчеризации не имеет фильтра для сгенерированного события, он передается целевому узлу и, наконец, целевой узел обрабатывает событие.
Фаза событий
В фазе пузырькового события событие передается от целевого узла к узлу сцены (снизу вверх). Если на каком-либо из узлов в цепочке отправки событий зарегистрирован обработчик для сгенерированного события, он будет выполнен. Если ни один из этих узлов не имеет обработчиков для обработки события, событие достигает корневого узла и, наконец, процесс будет завершен.
Обработчики событий и фильтры
Фильтры и обработчики событий — это те, которые содержат логику приложения для обработки события. Узел может зарегистрироваться более чем в одном обработчике / фильтре. В случае родительско-дочерних узлов вы можете предоставить общий фильтр / обработчик для родителей, который обрабатывается по умолчанию для всех дочерних узлов.
Как упомянуто выше, во время события выполняется фильтр, который выполняется, а во время фазы всплытия событий выполняется обработчик. Все обработчики и фильтры реализуют интерфейс EventHandler пакета javafx.event .
Добавление и удаление фильтра событий
Чтобы добавить фильтр событий к узлу, необходимо зарегистрировать этот фильтр с помощью метода addEventFilter () класса Node .
//Creating the mouse event handler EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { System.out.println("Hello World"); circle.setFill(Color.DARKSLATEBLUE); } }; //Adding event Filter Circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Таким же образом вы можете удалить фильтр, используя метод removeEventFilter (), как показано ниже —
circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Пример обработки событий
Ниже приведен пример, демонстрирующий обработку событий в JavaFX с использованием фильтров событий. Сохраните этот код в файле с именем EventFiltersExample.java .
import javafx.application.Application; import static javafx.application.Application.launch; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.scene.text.Text; import javafx.stage.Stage; public class EventFiltersExample extends Application { @Override public void start(Stage stage) { //Drawing a Circle Circle circle = new Circle(); //Setting the position of the circle circle.setCenterX(300.0f); circle.setCenterY(135.0f); //Setting the radius of the circle circle.setRadius(25.0f); //Setting the color of the circle circle.setFill(Color.BROWN); //Setting the stroke width of the circle circle.setStrokeWidth(20); //Setting the text Text text = new Text("Click on the circle to change its color"); //Setting the font of the text text.setFont(Font.font(null, FontWeight.BOLD, 15)); //Setting the color of the text text.setFill(Color.CRIMSON); //setting the position of the text text.setX(150); text.setY(50); //Creating the mouse event handler EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { System.out.println("Hello World"); circle.setFill(Color.DARKSLATEBLUE); } }; //Registering the event filter circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler); //Creating a Group object Group root = new Group(circle, text); //Creating a scene object Scene scene = new Scene(root, 600, 300); //Setting the fill color to the scene scene.setFill(Color.LAVENDER); //Setting title to the Stage stage.setTitle("Event Filters Example"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); } public static void main(String args[]){ launch(args); } }
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды.
javac EventFiltersExample.java java EventFiltersExample
При выполнении вышеупомянутая программа генерирует окно JavaFX, как показано ниже.
Добавление и удаление обработчиков событий
Чтобы добавить обработчик событий в узел, вам необходимо зарегистрировать этот обработчик, используя метод addEventHandler () класса Node, как показано ниже.
//Creating the mouse event handler EventHandler<javafx.scene.input.MouseEvent> eventHandler = new EventHandler<javafx.scene.input.MouseEvent>() { @Override public void handle(javafx.scene.input.MouseEvent e) { System.out.println("Hello World"); circle.setFill(Color.DARKSLATEBLUE); } }; //Adding the event handler circle.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandler);
Таким же образом вы можете удалить обработчик события, используя метод removeEventHandler (), как показано ниже —
circle.removeEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
пример
Следующая программа является примером, демонстрирующим обработку событий в JavaFX с использованием обработчиков событий.
Сохраните этот код в файле с именем EventHandlersExample.java .
import javafx.animation.RotateTransition; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.PerspectiveCamera; import javafx.scene.Scene; import javafx.scene.control.TextField; import javafx.scene.input.KeyEvent; import javafx.scene.paint.Color; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.Box; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.scene.text.Text; import javafx.scene.transform.Rotate; import javafx.stage.Stage; import javafx.util.Duration; public class EventHandlersExample extends Application { @Override public void start(Stage stage) { //Drawing a Box Box box = new Box(); //Setting the properties of the Box box.setWidth(150.0); box.setHeight(150.0); box.setDepth(100.0); //Setting the position of the box box.setTranslateX(350); box.setTranslateY(150); box.setTranslateZ(50); //Setting the text Text text = new Text("Type any letter to rotate the box, and click on the box to stop the rotation"); //Setting the font of the text text.setFont(Font.font(null, FontWeight.BOLD, 15)); //Setting the color of the text text.setFill(Color.CRIMSON); //setting the position of the text text.setX(20); text.setY(50); //Setting the material of the box PhongMaterial material = new PhongMaterial(); material.setDiffuseColor(Color.DARKSLATEBLUE); //Setting the diffuse color material to box box.setMaterial(material); //Setting the rotation animation to the box RotateTransition rotateTransition = new RotateTransition(); //Setting the duration for the transition rotateTransition.setDuration(Duration.millis(1000)); //Setting the node for the transition rotateTransition.setNode(box); //Setting the axis of the rotation rotateTransition.setAxis(Rotate.Y_AXIS); //Setting the angle of the rotation rotateTransition.setByAngle(360); //Setting the cycle count for the transition rotateTransition.setCycleCount(50); //Setting auto reverse value to false rotateTransition.setAutoReverse(false); //Creating a text filed TextField textField = new TextField(); //Setting the position of the text field textField.setLayoutX(50); textField.setLayoutY(100); //Handling the key typed event EventHandler<KeyEvent> eventHandlerTextField = new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent event) { //Playing the animation rotateTransition.play(); } }; //Adding an event handler to the text feld textField.addEventHandler(KeyEvent.KEY_TYPED, eventHandlerTextField); //Handling the mouse clicked event(on box) EventHandler<javafx.scene.input.MouseEvent> eventHandlerBox = new EventHandler<javafx.scene.input.MouseEvent>() { @Override public void handle(javafx.scene.input.MouseEvent e) { rotateTransition.stop(); } }; //Adding the event handler to the box box.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandlerBox); //Creating a Group object Group root = new Group(box, textField, text); //Creating a scene object Scene scene = new Scene(root, 600, 300); //Setting camera PerspectiveCamera camera = new PerspectiveCamera(false); camera.setTranslateX(0); camera.setTranslateY(0); camera.setTranslateZ(0); scene.setCamera(camera); //Setting title to the Stage stage.setTitle("Event Handlers Example"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); } public static void main(String args[]){ launch(args); } }
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды.
javac EventHandlersExample.java java EventHandlersExample
При выполнении вышеупомянутая программа генерирует окно JavaFX, отображающее текстовое поле и трехмерное окно, как показано ниже —
Здесь, если вы введете букву в текстовое поле, 3D-окно начнет вращаться вдоль оси x. Если вы нажмете на поле еще раз, вращение остановится.
Использование удобных методов для обработки событий
Некоторые из классов в JavaFX определяют свойства обработчика событий. Установив значения для этих свойств, используя соответствующие методы установки, вы можете зарегистрироваться в обработчике событий. Эти методы известны как удобные методы.
Большинство этих методов существуют в таких классах, как Node, Scene, Window и т. Д., И они доступны для всех их подклассов.
Например, чтобы добавить слушатель события мыши к кнопке, вы можете использовать вспомогательный метод setOnMouseClicked (), как показано ниже.
playButton.setOnMouseClicked((new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { System.out.println("Hello World"); pathTransition.play(); } }));
пример
Следующая программа представляет собой пример, который демонстрирует обработку событий в JavaFX с использованием вспомогательных методов.
Сохраните этот код в файле с именем ConvinienceMethodsExample.java .
import javafx.animation.PathTransition; import javafx.application.Application; import static javafx.application.Application.launch; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.LineTo; import javafx.scene.shape.MoveTo; import javafx.scene.shape.Path; import javafx.stage.Stage; import javafx.util.Duration; public class ConvinienceMethodsExample extends Application { @Override public void start(Stage stage) { //Drawing a Circle Circle circle = new Circle(); //Setting the position of the circle circle.setCenterX(300.0f); circle.setCenterY(135.0f); //Setting the radius of the circle circle.setRadius(25.0f); //Setting the color of the circle circle.setFill(Color.BROWN); //Setting the stroke width of the circle circle.setStrokeWidth(20); //Creating a Path Path path = new Path(); //Moving to the staring point MoveTo moveTo = new MoveTo(208, 71); //Creating 1st line LineTo line1 = new LineTo(421, 161); //Creating 2nd line LineTo line2 = new LineTo(226,232); //Creating 3rd line LineTo line3 = new LineTo(332,52); //Creating 4th line LineTo line4 = new LineTo(369, 250); //Creating 5th line LineTo line5 = new LineTo(208, 71); //Adding all the elements to the path path.getElements().add(moveTo); path.getElements().addAll(line1, line2, line3, line4, line5); //Creating the path transition PathTransition pathTransition = new PathTransition(); //Setting the duration of the transition pathTransition.setDuration(Duration.millis(1000)); //Setting the node for the transition pathTransition.setNode(circle); //Setting the path for the transition pathTransition.setPath(path); //Setting the orientation of the path pathTransition.setOrientation( PathTransition.OrientationType.ORTHOGONAL_TO_TAN GENT); //Setting the cycle count for the transition pathTransition.setCycleCount(50); //Setting auto reverse value to true pathTransition.setAutoReverse(false); //Creating play button Button playButton = new Button("Play"); playButton.setLayoutX(300); playButton.setLayoutY(250); circle.setOnMouseClicked (new EventHandler<javafx.scene.input.MouseEvent>() { @Override public void handle(javafx.scene.input.MouseEvent e) { System.out.println("Hello World"); circle.setFill(Color.DARKSLATEBLUE); } }); playButton.setOnMouseClicked((new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { System.out.println("Hello World"); pathTransition.play(); } })); //Creating stop button Button stopButton = new Button("stop"); stopButton.setLayoutX(250); stopButton.setLayoutY(250); stopButton.setOnMouseClicked((new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { System.out.println("Hello World"); pathTransition.stop(); } })); //Creating a Group object Group root = new Group(circle, playButton, stopButton); //Creating a scene object Scene scene = new Scene(root, 600, 300); scene.setFill(Color.LAVENDER); //Setting title to the Stage stage.setTitle("Convenience Methods Example"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); } public static void main(String args[]){ launch(args); } }
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды.
javac ConvinienceMethodsExample.java java ConvinienceMethodsExample
При выполнении вышеупомянутая программа генерирует окно JavaFX, как показано ниже. Здесь нажмите кнопку воспроизведения, чтобы запустить анимацию, и нажмите кнопку остановки, чтобы остановить анимацию.