JavaFX-이벤트 처리
JavaFX에서는 GUI 응용 프로그램, 웹 응용 프로그램 및 그래픽 응용 프로그램을 개발할 수 있습니다. 이러한 응용 프로그램에서는 사용자가 응용 프로그램 (노드)과 상호 작용할 때마다 이벤트가 발생했다고합니다.
예를 들어 버튼 클릭, 마우스 이동, 키보드를 통한 문자 입력, 목록에서 항목 선택, 페이지 스크롤 등이 이벤트 발생을 유발하는 활동입니다.
이벤트 유형
이벤트는 크게 다음 두 가지 범주로 분류 할 수 있습니다.
Foreground Events− 사용자의 직접적인 상호 작용이 필요한 이벤트. 그래픽 사용자 인터페이스에서 그래픽 구성 요소와 상호 작용하는 사람의 결과로 생성됩니다. 예를 들어 버튼 클릭, 마우스 이동, 키보드를 통한 문자 입력, 목록에서 항목 선택, 페이지 스크롤 등이 있습니다.
Background Events− 최종 사용자의 상호 작용이 필요한 이벤트를 백그라운드 이벤트라고합니다. 운영 체제 중단, 하드웨어 또는 소프트웨어 오류, 타이머 만료, 작업 완료는 백그라운드 이벤트의 예입니다.
JavaFX의 이벤트
JavaFX는 다양한 이벤트 처리를 지원합니다. 명명 된 클래스Event 패키지의 javafx.event 이벤트의 기본 클래스입니다.
하위 클래스의 인스턴스는 이벤트입니다. JavaFX는 다양한 이벤트를 제공합니다. 그들 중 일부는 아래에 나열되어 있습니다.
Mouse Event− 마우스 클릭시 발생하는 입력 이벤트입니다. 다음과 같은 클래스로 표시됩니다.MouseEvent. 여기에는 마우스 클릭, 마우스 누름, 마우스 놓기, 마우스 이동, 마우스 입력 대상, 마우스 종료 대상 등과 같은 동작이 포함됩니다.
Key Event− 노드에서 발생한 키 입력을 나타내는 입력 이벤트입니다. 다음과 같은 클래스로 표시됩니다.KeyEvent. 이 이벤트에는 키 누름, 키 놓기 및 키 입력과 같은 작업이 포함됩니다.
Drag Event− 마우스를 드래그 할 때 발생하는 입력 이벤트입니다. 다음과 같은 클래스로 표시됩니다.DragEvent. 여기에는 입력 된 드래그, 드롭 된 드래그, 입력 된 대상 드래그, 종료 된 대상 드래그, 위로 드래그 등과 같은 작업이 포함됩니다.
Window Event− 윈도우 표시 / 숨기기와 관련된 이벤트입니다. 다음과 같은 클래스로 표시됩니다.WindowEvent. 여기에는 창 숨기기, 창 표시, 창 숨김, 창 표시 등과 같은 작업이 포함됩니다.
이벤트 처리
이벤트 처리는 이벤트를 제어하고 이벤트가 발생하는 경우 어떤 일이 발생해야하는지 결정하는 메커니즘입니다. 이 메커니즘에는 이벤트가 발생할 때 실행되는 이벤트 처리기로 알려진 코드가 있습니다.
JavaFX는 이벤트를 처리하기위한 핸들러와 필터를 제공합니다. JavaFX에서 모든 이벤트는-
Target− 이벤트가 발생한 노드. 대상은 창, 장면 및 노드가 될 수 있습니다.
Source− 이벤트가 생성 된 소스가 이벤트의 소스가됩니다. 위의 시나리오에서 마우스는 이벤트의 소스입니다.
Type− 발생한 이벤트의 유형 마우스 이벤트의 경우 – 마우스를 눌렀을 때, 마우스를 놓는 것이 이벤트 유형입니다.
다음과 같이 그룹 개체를 사용하여 삽입 된 원, 중지 및 재생 버튼이있는 응용 프로그램이 있다고 가정합니다.
재생 버튼을 클릭하면 소스는 마우스가되고 대상 노드는 재생 버튼이되고 생성되는 이벤트 유형은 마우스 클릭이됩니다.
JavaFX의 이벤트 처리 단계
이벤트가 생성 될 때마다 JavaFX는 다음 단계를 거칩니다.
루트 건설
이벤트가 생성 될 때마다 이벤트의 기본 / 초기 경로는 Event Dispatch chain. 스테이지에서 소스 노드까지의 경로입니다.
다음은 위 시나리오에서 재생 버튼을 클릭했을 때 생성 된 이벤트에 대한 이벤트 디스패치 체인입니다.
이벤트 캡처 단계
이벤트 전달 체인이 생성 된 후 응용 프로그램의 루트 노드가 이벤트를 전달합니다. 이 이벤트는 디스패치 체인의 모든 노드로 이동합니다 (위에서 아래로). 이러한 노드 중 하나에filter생성 된 이벤트에 등록되면 실행됩니다. 디스패치 체인의 노드 중 생성 된 이벤트에 대한 필터가없는 경우 대상 노드로 전달되고 마지막으로 대상 노드가 이벤트를 처리합니다.
이벤트 버블 링 단계
이벤트 버블 링 단계에서는 이벤트가 대상 노드에서 스테이지 노드로 이동합니다 (아래에서 위로). 이벤트 디스패치 체인의 노드 중 하나에handler생성 된 이벤트에 등록되면 실행됩니다. 이러한 노드에 이벤트를 처리 할 핸들러가 없으면 이벤트가 루트 노드에 도달하고 마지막으로 프로세스가 완료됩니다.
이벤트 처리기 및 필터
이벤트 필터와 핸들러는 이벤트를 처리하기위한 애플리케이션 로직을 포함하는 것들입니다. 노드는 둘 이상의 핸들러 / 필터에 등록 할 수 있습니다. 부모-자식 노드의 경우 모든 자식 노드에 대해 기본값으로 처리되는 공통 필터 / 핸들러를 부모에게 제공 할 수 있습니다.
위에서 언급했듯이 이벤트 동안 처리는 실행되는 필터이며 이벤트 버블 링 단계에서 핸들러가 실행됩니다. 모든 핸들러와 필터는 인터페이스를 구현합니다.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
실행시 위의 프로그램은 아래와 같이 텍스트 필드와 3D 상자를 표시하는 JavaFX 창을 생성합니다.
여기에서 텍스트 필드에 문자를 입력하면 3D 상자가 x 축을 따라 회전하기 시작합니다. 상자를 다시 클릭하면 회전이 중지됩니다.
이벤트 처리를위한 편의 방법 사용
JavaFX의 일부 클래스는 이벤트 처리기 속성을 정의합니다. 각각의 setter 메서드를 사용하여 이러한 속성에 값을 설정하면 이벤트 처리기에 등록 할 수 있습니다. 이러한 방법을 편의 방법이라고합니다.
이러한 메서드의 대부분은 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 창이 생성됩니다. 여기에서 재생 버튼을 클릭하여 애니메이션을 시작하고 중지 버튼을 클릭하여 애니메이션을 중지합니다.