JavaFX | 액션 이벤트 사용 | EventHandler와 handleEvent


EventHandler는 하나의 메소드만 포함된 단순한 인터페이스이다. public void handle(Event e)라는 메소드를 정의하는 것만으로 필요한 처리를 할 수 있다. 다만, 이를 그대로 사용되는 경우는 거의 없다.

EventHandler에 있는 handle 메소드에는 발생한 이벤트를 “Event"라는 클래스의 인스턴스 인수로 받을 수 있게 되어 있다. 이 Event는 이벤트의 종류마다 많은 서브 클래스를 가지고 있으며, EventHandler에서는 어떤 이벤트용 Event 하위 클래스를 전달되는지를 전부를 한데 모아 설정할 수 있도록 되어 있다.

예를 들어, 익명 클래스(Anonymous Class)를 이용하여 EventHandler를 생성하는 경우에는 다음과 같이 작성할 것이다.

new EventHandler() {
    @Override
    public void handle (Event e) {
        // 여기에 처리 코드를 작성한다.
    }
}

액션 이벤트는 “ActionEvent"라는 Event의 서브 클래스가 인수로 전달된다. setOnAction는 다음과 같이 작성하는 것이 일반적이다.

new EventHandler<ActionEvent>() {
    public void handle (ActionEvent e) {
        // 여기에 처리 코드를 작성한다.
    }
}

일반적은 형태로 ActionEvent를 지정하고 handle 메소드에는 ActionEvent가 인수로 전달되도록 작성한다. 이것으로 액션 이벤트를 처리하는 EventHandler를 만들 수 있게 되었다.

그러면 실제로 Button에 EventHandler를 지정한 이벤트 처리 예제를 만들어 보자.

package com.dekuma.spring;
 
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
 
public class App extends Application {
    Label label;
    TextField field;
    Button button;
 
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) throws Exception {
        label = new Label("This is JavaFX!");
        field = new TextField();
        button = new Button("Click");
        // 엑션 이벤트 처리 지정
        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                String msg = "you typed: " + field.getText();
                label.setText(msg);
            }
        });
        BorderPane pane = new BorderPane();
        pane.setTop(label);
        pane.setCenter(field);
        pane.setBottom(button);
        Scene scene = new Scene(pane, 320, 120);
        stage.setScene(scene);
        stage.show();
    }
 
}

표시된 버튼을 클릭하면 상단 필드에 입력한 텍스트를 꺼내 메시지를 라벨에 표시하는 예제이다. setOnAction에서 new EventHandler<ActionEvent>()을 설정하고있는 것을 알 수 있을 것이다.