Bind´s na Prática
Autor: Jean Paul Lopes | Publicado: 2011-07-25T06:07:00-07:00

Uma das melhores funcionalidades  do JavaFX Script (na minha opinião) era o operador "bind".

Com a mudança da linguagem na versão 2.0 este operador foi alterado para um tipo especial de dado. Porém de grande versatilidade.

Como dito no título do post, vamos vê-lo na prática. Abaixo temos uma aplicação que demonstrará algumas de suas aplicações.

public class Properties extends Application {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Application.launch(Properties.class, args);
    }
    private Rectangle rect1;
    private Rectangle rect2;
    private Rectangle rect3;
    private TextBox edit1;
    private TextBox edit2;
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World");
        Group root = new Group();
        Scene scene = new Scene(root, 300, 250, Color.LIGHTGREEN);
        Button btn = new Button();
        btn.setLayoutX(40);
        btn.setLayoutY(130);
        btn.setText("Rectangles");
        btn.setOnAction(new EventHandler() {

            public void handle(ActionEvent event) {
                TranslateTransition tt = new TranslateTransition(Duration.valueOf(3000),rect1);
                RotateTransition rt = new RotateTransition(Duration.valueOf(3000), rect1);
                tt.toXProperty().set(600);
                tt.toYProperty().set(500);
                tt.cycleCountProperty().set(3);
                rt.cycleCountProperty().set(3);
                rt.setToAngle(720);
                tt.autoReverseProperty().set(true);
                tt.play();
                rt.play();
            }
        });
       Button btn1 = new Button();
        btn1.setLayoutX(40);
        btn1.setLayoutY(150);
        btn1.setText("edits");
        btn1.setOnAction(new EventHandler() {

            public void handle(ActionEvent event) {
                edit1.setLayoutX(100);
                edit1.setLayoutY(200);
                edit2.textProperty().bindBidirectional(edit1.textProperty());
            }
        });
       
        rect1 = new Rectangle(100,100);
        rect2 = new Rectangle(100,100);
        rect3 = new Rectangle(200,150,100,100);
        rect2.translateXProperty().bind(rect1.translateXProperty().add(rect1.widthProperty()).add(20));
        rect2.layoutYProperty().bind(rect1.layoutYProperty());
        rect2.rotateProperty().bind(rect1.rotateProperty().divide(2));
        rect3.rotateProperty().bind(rect1.rotateProperty().multiply(2));
        
        edit1 = new TextBox("edit1");
        edit2 = new TextBox();
        
        edit2.layoutXProperty().bind(edit1.layoutXProperty());
        edit2.layoutYProperty().bind(edit1.layoutYProperty().add(edit1.heightProperty()).add(10));
        
        root.getChildren().addAll(rect1,rect2,rect3,edit1,edit2);        
        root.getChildren().addAll(btn,btn1);         
        primaryStage.setScene(scene);
        primaryStage.setVisible(true);
    }
}
A aplicação coloca na janela três retangulos. O primeiro deles (rect1) receber alterações de posicionamento e rotação através de Transition's (mais sobre eles em ).
O segundo retângulo terá suas propriedades translateX, translateY e rotation acompanhando as propriedades do objeto rect1. A propriedade translateY será companhada diretamente, já a translateX somará também a largura do objeto rect1, mantendo sempre a mesma distância entre os dois retângulos. Já a propriedade rotation do objeto rect2 acompanhará a mesma propriedade do objeto rect1, mas numa razão da metade de sua "velocidade".
Ao contrário, o objeto rect3 acompanhará a rotação do objeto rect1, porém com o dobro de sua "velocidade".

Já os objetos edit1 e edit2 passará a acompanhar o propriedade text um do outro, através de um "bindBidirectional". Assim com um único método acrescentamos a capacidade de acompanhamentos bidirecionais, onde as alterações feitas em uma propriedade refletem diretamente em outra e vice-versa.

São exemplos simples mas demonstram a capacidade e potencialidade das classes que implementa a interface Property. 

Até mais,