JavaFX | 속성 이벤트 처리 | 슬라이더의 valueProperty를 이벤트 처리

슬라이더도 값이 변경되었을 때의 이벤트를 유사한 방식으로 처리 할 수 있다. Slider 클래스는 설정된 값은 “valueProperty"라는 속성으로 처리된다.

이것은 “DoubleProperty"라는 클래스의 인스턴스로 속성을 관리하는 기능이 포함되어 있다. 이 DoubleProperty에 addListener에서 이벤트 리스너를 설정하여 값이 변경되었을 때 처리를 수행 할 수 있다.

그럼 이것도 간단한 샘플을 만들어 사용해 보자. 이전에 FXML에서 <center> 태그를 다음과 같이 작성하자.

<center>
    <Slider fx:id="slider1" min="0" max="100"/>
</center>

이것으로 슬라이더가 하나 표시되도록 되었다. 여기에 이벤트 처리를 설정하여 조작하면 실시간으로 표시가 업데이트 되도록 하자.

아래와 같이 간단한 예제를 작성하자.

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.Label;
import javafx.scene.control.Slider;
 
public class AppController implements Initializable {
    @FXML Label label1;
    @FXML Slider slider1;
     
    @Override
    public void initialize(URL location, ResourceBundle resources) {
 
        slider1.valueProperty().addListener((ObservableValue<? extends Number> 
                observ, Number oldVal, Number newVal)->{
            double oldnum = oldVal.doubleValue();
            double newnum = newVal.doubleValue();
            label1.setText(oldnum + "->" + newnum);
        });
    }
}

이것은 값을 변경 전과 변경 후의 값을 얻어와 표시하는 샘플이다. 슬라이더를 조작하면 “12.34567 -> 98.7654"와 같은 상태로, 이전 값과 새로운 값이 표시된다.

여기에서는 슬라이더에 이벤트 리스너 설정을 다음과 같은 형태로 작성하고 있다.

slider1.valueProperty().addListener ......

Slider 클래스의 valueProperty에서 얻은 DoubleProperty 인스턴스의 addListener에 이벤트 리스너를 설정한다. 이것은 다음과 같은 형태로 되어 있다.

addListener((ObservableValue <? extends Number> observ, Number oldVal, Number newVal) -> {
    // 이벤트 처리
});

ObservableValue는 Number의 서브 클래스로 정의되어 있다. 그리고 전달되는 값은 Number 인스턴스가 있다. 그 다음은 전달된 Number에서 메소드를 호출하여 필요한 값 등을 취득 할뿐이다.

double oldnum = oldVal.doubleValue();
double newnum = newVal.doubleValue();

여기에서는 doubleValue에서 double 값으로 얻어 표시하고 있다. 정수 만들려고 한다면 intValue 메소드를 사용하면 된다.

이벤트 리스너와 ObservableValue의 관계가 이것으로 많이 알게 되었다고 생각한다. ObservableValue를 잘 다룰 수 있게 된다면, 속성의 이벤트 처리는 대체로 마스터하였다고 생각해도 될 것이다.