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);
	}
}

+ Recent posts