JavaFX | 액션 이벤트 사용 | 람다 식으로 더 간결하게!


이것으로 Button을 클릭했을 때의 액션 이벤트는 완성이다. 하지만 익명 클래스를 이용한 쓰기는 좀 귀찮다. 이를 좀 더 간단하게 사용 방법을 설명한다.

EventHandler 인터페이스에는 handle라는 메소드가 하나 포함되어 있다. 이러한 “메소드 하나밖에 없는 인터페이스"는 Java8에서는 “함수 인터페이스"라고 한다. 이것은 함수 객체 (함수를 값으로 처리하는 것)의 대용품(?)처럼 처리할 수 있도록 되어 있다.

그것을 가능하게 하는 것이 “람다 식"이다. Java8에서 람다 식을 사용한 적이 없는 사람도 많을 것이니 간단하게 정리해 보도록 하겠다.

람다 표현식은 함수 인터페이스의 익명 클래스에 인한 인스턴스 구현을 매우 간단하게 작성 할 수 있도록 한 기능이다. 이 setOnAction 예로 들어보면, 다음과 같이 변경 가능하다.

일반적인 작성

button.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent e) {
        // 여기에 처리 작성
    }
});

람다 식 작성

button.setOnAction((ActionEvent) -> {
    // 여기에 처리 작성
});

매우 심플하게 되는 것을 알 수 있을 것이다. 람다 식에는 메소드를 작성할 필요가 없다. 함수 인터페이스의 경우에는 호출 메소드가 하나 밖에 없기 때문에, 그 메소드가 호출 될 때 자동으로 판단하게 된다.

아래 예제는 이전 샘플을 람다 식으로 변경하여 작성되었다.

package com.devkuma.javafx;
 
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((ActionEvent)-> {
            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();
    }
 
}

이벤트 처리의 구현 부분이 매우 알기 쉽게 되어 있는가? 모처럼 Java8에서 JavaFX를 사용해야 하니, 꼭 람다 식을 이용한 쓰는 법을 기억두도록 하자.