Учебники

JavaFX — обработка событий

В 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, как показано ниже. Здесь нажмите кнопку воспроизведения, чтобы запустить анимацию, и нажмите кнопку остановки, чтобы остановить анимацию.