JavaFX | FXML 액션 이벤트 구현 | setOnAction에서 액션 이벤트를 구현


컨트롤러를 사용한 액션 이벤트의 구현은 매우 간단하지만, FXML 측에 onAction을 작성을 해야 한다. AWT와 Swing에서는 Java 코드에서 이벤트 처리를 구현하는 것이 기본이었다.

이전에 FXML를 사용하지 않고, Application 클래스에서 모든 처리를 작성한 경우에는 “setOnAction"메소드 액션 이벤트를 통합 할 수 있었다. FXML와 컨트롤러를 사용하는 경우에도 이 점은 동일하다. 그러나 setOnAction을 하는 것이 Application 클래스가 아닌 컨트롤러 측이 된다는 점이 다르다.

그럼 이 방식으로도 구현을 해보자. 먼저 FXML의 <Button> 태그에서 onActio 속성을 제거하고, 컨트롤러 클래스의 소스 코드를 아래와 같이 변경을 하자.

package com.devkuma.javafx;
 
import java.net.URL;
import java.util.ResourceBundle;
 
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
 
public class AppController implements Initializable {
    @FXML Label label1;
    @FXML TextField field1;
    @FXML Button btn1;
     
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        btn1.setOnAction((AtionEvent)->{
            String str = field1.getText();
            str = "당신은 쓴 글은 '" + str + "' 이것입니다.";
            label1.setText(str);
        });
    }
 
}

이를 실행해서 버튼을 클릭해 보면, 처리가 제대로 수행되는 것을 확인 할 수 있다.

이 예제에서는 이전에 컨트롤러와는 미묘하게 클래스의 정의가 변화한 것을 알 수 있을 것이다. javafx.fxml의 “Initializable"라는 인터페이스라 implements되어 있다. 이것는 FXML의 초기화 처리에 관한 기능을 부가하기 위한 것이다.

클래스에는 initialize 메소드가 추가되어 있다. 여기에 FXML 관련된 초기화 처리를 작성한다. 이 메소드가 호출되는 시점에는 @FXML 어노테이션이 붙은 인스턴스 필드가 생성되어 할당되어 있으므로, 그대로 Button의 setOnAction를 호출하여 액션 이벤트를 할당 할 수 있다.

우선, 이것으로 FXML 기반으로 액션 이벤트를 구현할 수 있게 되었다. 실제로 여러가지 처리를 동작 시켜보고, 동작을 확인해 보도록 하자.