ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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));
    
    }
    
     
    
    }
    
    윈도우 크기에 상관없이 화면 중앙에 원이 그려진다.

    댓글

Designed by Tistory.