JavaFX | FXML 액션 이벤트 구현 | FXML으로 컨트롤러 사용


JavaScript는 손쉽고 편리하지만, 아무래도 구체적인 처리는 Java로 쓰고 싶다는 사람이 당연히 많을 것이다. 그러한 경우는 Java 클래스에 처리를 정의해 두고, 그것을 FXML의 컨트롤에 할당 할 수 있다.

이러한 “구체적인 이벤트 처리하는 클래스"를 일반적으로 컨트롤러라고 한다. 컨트롤러 클래스는 기본적으로 POJO(Pure Old Java Object)이며, 어떤 클래스도 상속하지 받지 않은 간단한 클래스로 정의한다.

컨트롤러는 FXML의 Pane 클래스에 “fx:controller"라는 속성으로 지정한다. 이렇게 하면 해당 클래스가 컨트롤러로 구성되어 그 클래스에있는 메소드를 그대로 doAction 등의 이벤트 처리에 대한 속성에 지정할 수있게됩니다.

그럼, 컨트롤러는 만들어 보자. 우선 FXML를 다시 작성해야 한다. app.fxml을 아래와 같이 수정한다.

<?xml version="1.0" encoding="UTF-8"?>
 
<?language javascript?>
<?import java.lang.*?>
<?import java.net.URL ?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
 
<BorderPane xmlns="http://javafx.com/javafx"
        xmlns:fx="http://javafx.com/fxml"
        fx:controller="com.devkuma.javafx.AppController">
    <stylesheets>
        <URL value="@app.css" />
    </stylesheets>
    <top>
        <Label fx:id="label1" text="This is FXML!" />
    </top>
    <center>
        <TextField fx:id="field1" />
    </center>
    <bottom>
        <Button fx:id="btn1" onAction="#doAction" text="Click" />
    </bottom>
</BorderPane>

이번에는 AppController라는 컨트롤러 클래스를 만들어 사용하는 형태로 되어 있다. Pane 태그를 보면,

<BorderPane xmlns="http://javafx.com/javafx" 
    xmlns:fx="http://javafx.com/fxml"
    fx:controller="com.devkuma.javafx.AppController">

이와 같이 작성되어 있다. fx:controller=“com.devkuma.javafx.AppController"에 의해 이 AppController 클래스가 컨트롤러로 지정된다.

또한 <Button> 태그를 보면 onAction 속성이 미묘하게 수정이 되었다는 것을 알 수 있을 것이다.

<Button onAction="#doAction" text="Click" />

컨트롤러의 메서드는 “#메서드 이름"형태로 지정한다. 그러면 AppController 클래스의 doAction 메소드가 이 Button의 액션 이벤트 처리에 설정된다.