JavaFX는 컨트롤의 속성(property)을 감시하는 리스너 설정 가능
ex) Slider의 value 속성값을 감시하는 리스너를 설정해서 value 속성값이 변경되면 리스너가 다른 컨트롤러의 폰트나 이미지의 크기를 변경 가능
JavaFX의 컨트롤 속성
: Getter, Setter, Property 객체를 리턴하는 메소드
text 속성값을 감시하는 ChangeListener를 설정하는 코드
textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue(? extends String> observable,
String oldValue, String newValue) {
}
});
addListener() 메소드가 ChangeListener를 Property 객체에 설정하면, text 속성이 변경되었을 때 ChangeListener의 changed() 메소드가 자동으로 실행됨
속성의 이전 값은 oldValue에, 새로운 값은 newValue에 매개값으로 전달
Label과 Slider 컨트롤 배치
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.AnchorPane?>
<BorderPane xmlns:fx="http://javafx.com/fxml"
fx:controller="sec06.exam01_property_listener.RootController"
prefHeight="250.0" prefWidth="350.0">
<center>
<Label fx:id="label" text="JavaFX">
<font>
<Font size="0" /> <!-- Label의 기본 폰트 크기는 0 -->
</font>
</Label>
</center>
<bottom>
<Slider fx:id = "slider" />
</bottom>
</BorderPane>
속성 감시 리스너 설정
package sec06.exam01_property_listener;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.text.Font;
public class RootController implements Initializable {
@FXML private Slider slider;
@FXML private Label label;
@Override
public void initialize(URL location, ResourceBundle resources) {
slider.valueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
label.setFont(new Font(newValue.doubleValue())); //Label의 폰트 변경시 Slider의 변경된 Value값으로 변경?
}
});
}
}
실행 클래스
package sec06.exam01_property_listener;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class AppMain extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("root.fxml"));
Scene scene = new Scene(root);
primaryStage.setTitle("AppMain");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
'Java > 17. JavaFX' 카테고리의 다른 글
Day 26 : JavaFX 속성 감시와 바인딩 - Bindings 클래스 (0) | 2021.11.24 |
---|---|
Day 26 : JavaFX 속성 감시와 바인딩 - 속성 바인딩 (0) | 2021.11.23 |
Day 26 : JavaFX 이벤트 처리 - FXML 컨트롤러 (Controller) (0) | 2021.11.23 |
Day 26 : JavaFX 이벤트 처리 - 이벤트 핸들러 (Event Handler) (0) | 2021.11.23 |
Day 26 : JavaFX 컨테이너 - StackPane 컨테이너 (0) | 2021.11.23 |