메소드에는 윈도우 닫기, 컨트롤 내용 변경, 다이얼로그 띄우기 등의 코드를 작성할 수 있다.
EventHandler는 제네릭 타입이기 때문에 타입 파라미터는 발생된 이벤트의 타입이 된다. 예를 들
어 ActionEvent를 처리하는 핸들러는 EventHandler가 되고, MouseEvent를
처리하는 핸들러는 EventHandler가 된다.
EventHandler가 컨트롤에서 발생된 이벤트를 처리하려면 먼저 컨트롤에 EventHandler를 등록
해야 한다. 컨트롤은 발생되는 이벤트에 따라서 EventHandler를 등록하는 다양한 메소드가 있는
데, 이 메소드들은 setOnXXX ( ) 이름을 가지고 있다. XXX는 보통 이벤트 이름과 동일하다.
몇 가지 예를 들어보자. Button을 클릭할 때 발생하는 ActionEvent를 처리하는 EventHandler
를 등록하려면 다음과 같이 setOnAction ( ) 메소드를 사용한다.
Button button = new Button();
button.setOnAction(new EventHandler() {
```java
@Override
public void handle(ActionEvent event) { … }
});
```
TableView의 행을 클릭할 때 발생하는 MouseEvent를 처리하는 EventHandler
를 등록하려면 다음과 같이 setOnMouseClicked ( ) 메소드를 사용한다.
TableView tableView = new TableView();
tableView.setOnMouseClicked(new EventHandler() {
```java
@Override
public void handle(MouseEvent event) { … }
});
```
윈도우Stage의 우측 상단 닫기(×) 버튼을 클릭했을 때 발생하는 WindowEvent를 처리하는
EventHandler를 등록하려면 다음과 같이 setOnCloseRequest ( ) 메소드를
사용한다.
stage.setOnCloseRequest(new EventHandler() {
```java
@Override
public void handle(WindowEvent event) { … }
});
```
JavaFX는 **위임형 이벤트 처리 모델(Delegation Event Model)**을 사용합니다. 이는 이벤트가 발생한 **소스(Source)**가 이벤트를 직접 처리하지 않고, 별도의 **핸들러(Handler)** 객체에게 처리를 위임하는 방식입니다.
```mermaid
sequenceDiagram
participant User
participant Button as "Source (Button)"
participant Handler as EventHandler
User->>Button: Click
Button->>Handler: handle(ActionEvent)
Handler-->>Button: 처리 완료
```
---
## 1. 이벤트 핸들러 등록
이벤트 핸들러를 등록하려면 `setOn...` 메소드를 사용합니다. 예를 들어 버튼 클릭 시 발생하는 `ActionEvent`를 처리하려면 `setOnAction()` 메소드를 사용합니다.
### 1) 익명 구현 객체 사용
```java
Button btn = new Button("버튼");
btn.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent event) {
System.out.println("버튼 클릭됨");
}
});
```
### 2) 람다식 사용 (Java 8+)
`EventHandler`는 함수형 인터페이스이므로 람다식으로 간결하게 표현할 수 있습니다.
```java
btn.setOnAction(event -> {
System.out.println("버튼 클릭됨");
});
```
---
## 2. FXML과 이벤트 처리 (Controller)
FXML로 UI를 구성할 경우, 이벤트 처리 코드는 **컨트롤러(Controller)**라는 별도의 클래스에서 담당합니다.
### 1) FXML 설정 (`root.fxml`)
- 루트 컨테이너에 `fx:controller` 속성으로 컨트롤러 클래스를 지정합니다.
- 이벤트가 발생할 컨트롤에 `onAction` 속성으로 컨트롤러의 메소드를 지정합니다 (예: `#handleBtnAction`).
- 컨트롤러에서 참조해야 할 컨트롤에는 `fx:id`를 부여합니다.
```xml
```
### 2) 컨트롤러 구현 (`RootController.java`)
- `Initializable` 인터페이스를 구현하여 초기화 작업(`initialize`)을 수행할 수 있습니다.
- `@FXML` 어노테이션을 사용하여 FXML에 정의된 컨트롤(`fx:id`)과 메소드(`onAction`)를 연결합니다.
```java
package sec05.exam01;
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;
public class RootController implements Initializable {
직접 EventHandler
생성 후 등록
}
});
btn2.setOnAction(event->handleBtn2Action(event));
btn3.setOnAction(event->handleBtn3Action(event));
람다식 이용
}
```java
public void handleBtn1Action(ActionEvent event) {
System.out.println("버튼1 클릭");
}
public void handleBtn2Action(ActionEvent event) {
System.out.println("버튼2 클릭");
}
public void handleBtn3Action(ActionEvent event) {
System.out.println("버튼3 클릭");
}
}
```
4) 이벤트 처리 메소드 매핑
컨트롤러에서 EventHandler를 생성하지 않고도 바로 이벤트 처리 메소드와 연결할 수 있는 방법
이 있다. Button 컨트롤을 작성할 때 다음과 같이 onAction 속성값으로 "#메소드명"을 주면 내부
적으로 EventHandler 객체가 생성되기 때문에 컨트롤러에서는 해당 메소드만 작성하면 된다.
FXML 파일
```java
```
Controller 클래스
```java
public void handleBtnAction(ActionEvent event) { … }
```