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의 액션 이벤트 처리에 설정된다.