JavaFX | 속성 이벤트 처리 | ChangeListener을ToggleGroup에 설정

그럼, 작성한 FXML를 읽어 들여, ToggleGroup 이벤트 처리를 포함한 컨트롤러 클래스를 만들어 보자.

아래에 간단한 예제 코드를 준비해 두었다.

package com.devkuma.javafx;
 
import java.net.URL;
import java.util.ResourceBundle;
 
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup;
 
public class AppController implements Initializable {
    @FXML Label label1;
    @FXML ToggleGroup group1;
     
    @Override
    public void initialize(URL location, ResourceBundle resources) {
 
        group1.selectedToggleProperty().addListener((ObservableValue<? extends Toggle> 
            observ, Toggle oldVal, Toggle newVal)->{
            String oldStr = (String)oldVal.getUserData();
            String newStr = (String)newVal.getUserData();
            label1.setText(oldStr + "->" + newStr);
        });
    }
 
}

실행하여 라디오 버튼을 클릭하여 보자. 그러면 윈도우 상단의 라벨에 “남자 -> 여자"라는 텍스트가 표시된다. 선택 전과 선택 후에 각각의 RadioButton에 설정된 userData을 표시하고 있는 것을 알 수 있다.

여기에서는 ToggleGroup의 selectedToggleProperty에 설정된 ReadOnlyObjectProperty에 다음과 같은 형태로 리스너를 설정하고 있다.

ReadOnlyObjectProperty.addListener((ObservableValue<? extends Toggle> observ,
    Toggle oldVal, Toggle newVal) -> {
    // 수행할 작업
});

여기에서는 람다 식을 사용하여 설정 방법을 적어 보겠다. ChangeListener에는 changed라는 메소드 하나만 정의되어 있다. 이것은 다음과 같은 형태를 하고 있다.

void changed(ObservableValue<? extends T> observable, T oldValue, T newValue)

ObservableValue는 제네릭 형을 설정 할 수 있다. ToggleGroup의 selectedtoggleProperty에 포함 된 경우 “Toggle"라는 클래스를 상속하는 형태로 ObservableValue가 제공된다. 그 외에 oldValue, newValue도 Toggle 인스턴스로 전달된다.

이 Toggle이라는 클래스 (정확하게는 인스턴스이지만)은 ON/OFF로 다루어지는 값을 관리하기 위한 클래스이다. 이 Toggle에서 변경된 값에 대한 정보를 검색한다. 여기에서는 “getUserData"라는 메소드를 사용하고 있다. 이것으로 부터 그 Toggle로 설정되어 있는 UserData 속성의 값을 꺼낸다. 이는 FXML에 추가되어 있는 “userData” 속성의 값이다.

ReadOnlyObjectProperty, ObservableValue, Toggle와 낯선 클래스가 몇개 등장해서 이해하기 어려울지도 모르지만, 기본적인 속성 변경 이벤트 리스너 처리는 모두 유사한 형태로 되어 있기 때문에 이러한 이벤트 처리에 익숙해지면 어떤 것도 유사한 방식으로 처리할 수 있다.