-
javaFX 속성 바인딩고급 JAVA/FX 2020. 5. 22. 19:22
속성 바인딩
: JavaFX 속성은 다른 속성과 바인딩될 수 있음 => 바인딩된 속성들은 하나가 변경되면 자동으로 다른 하나도 변경됨.
ex) 두 개의 TextArea 컨트롤이 있고 text 속성들을 바인딩하면 사용자가 한쪽에 TextArea에 내용을 입력했을 때 다른 쪽의 TextArea에도 동일한 내용이 자동 입력됨.
TextArea ta1 = new TextArea();
TextArea ta2 = new TextArea();
ta2.textProperty().bind(ta1.textProperty());
*bind() 메서드는 단방향이다. 위 코드대로라면 ta1->ta2만 되고, ta2->ta1은 불가능.
ta2에는 아예 입력조차 불가.
양방향 바인딩을 하고 싶을 때 : bind() 대신에 bindBidirectional() 메서드나 Bindings.bindBidirectional() 메서드를 이용.
ta2.textProperty(). bindBidirectional(ta1.textProperty()); or
Bindings.bindBidirectional(ta1.textProperty(), ta2.textProperty());
언바인딩 하려면 위 메서드들에 bind 앞에 un 만 붙여주면 된다.
ta2.textProperty().unbind();
ta2.textProperty(). unbindBidirectional(ta1.textProperty()); or
Bindings.unbindBidirectional(ta1.textProperty(), ta2.textProperty());
public class RootController implements Initializable { @FXML private TextArea ta1; @FXML private TextArea ta2; @Override public void initialize(URL location, ResourceBundle resources) { Bindings.bindBidirectional(ta1.textProperty(), ta2.textProperty()); } }
inding 클래스
: 두 속성이 항상 동일한 값과 타입을 가질 수는 없음. => 따라서 두 속성값이 동일하려면 연산작업이 필요할 수도 있음. ex) 윈도우 크기에 상관없이 무조건 정중앙에 원을 그릴 때. 루트 컨테이너의 폭의 1/2이 원의 X좌표, 높이의 1/2이 원의 Y좌표가 될 것임.
이러한 연산을 할 때 사용할 수 있는 것이 Bindings 클래스가 제공하는 정적 메서드들입니다.
예제) FXML <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.*?> <?import javafx.scene.shape.*?> <AnchorPane xmlns:fx="http://javafx.com/fxml" fx:id="root" fx:controller="thisisjava.RootController" prefHeight="200.0" prefWidth="300.0" > <children> <Circle fx:id="circle" fill="blue" radius="50.0" stroke="BLACK" />//원의 속성. </children> </AnchorPane> 자바1) package thisisjava; 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 = (Parent)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); } } 자바2) package thisisjava; import java.net.URL; import java.util.ResourceBundle; import javafx.beans.binding.Bindings; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.layout.AnchorPane; import javafx.scene.shape.Circle; public class RootController implements Initializable { @FXML private AnchorPane root; @FXML private Circle circle; @Override public void initialize(URL location, ResourceBundle resources) { circle.centerXProperty().bind(Bindings.divide(root.widthProperty(), 2)); circle.centerYProperty().bind(Bindings.divide(root.heightProperty(), 2)); } } 윈도우 크기에 상관없이 화면 중앙에 원이 그려진다.
'고급 JAVA > FX' 카테고리의 다른 글
javaFX - 입력 컨트롤 (0) 2020.05.22 javaFX 컨트롤 - 버튼 컨트롤 (0) 2020.05.22 javaFX 이벤트 핸들러 (0) 2020.05.22 javaFX - 컨테이너 : AnchorPane 컨테이너 (0) 2020.05.22 javaFX fxml로딩과 Scene 작성 / JavaFX Scene Builder (0) 2020.05.22