绑定centerX属性不起作用

时间:2014-08-25 07:11:47

标签: properties javafx java-8

我正在学习Java 8的新功能,其中包含 Java SE 8 for the Inally Impatient

在第76和77页上,作者说:

  

我们总是希望圆圈在场景中居中。

     

...

     

当场景宽度改变时,也是如此   那个财产。剩下的就是将计算属性绑定到   圆圈的centerX属性:

circle.centerXProperty().bind(Bindings.divide(scene.widthProperty(),
     

2));

由于没有完整的可运行样本,我创建了自己的样本。这是它:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class Exercise0404 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Circle circle = new Circle(50);
        FlowPane pane = new FlowPane(circle);

        Scene scene = new Scene(pane);
        circle.centerXProperty().bind(scene.widthProperty().divide(2));
        circle.centerYProperty().bind(scene.heightProperty().divide(2));
        stage.setScene(scene);
        stage.setTitle("Hello");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

但是如果我运行代码并调整场景大小,则圆圈不会移动到中心。我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

您将圈子放在负责布局的FlowPane中。

使用绝对定位时,更喜欢使用适当的窗格:javafx.scene.layout.Pane。来自Pane javadoc:

  

这个类可以直接用于需要儿童绝对定位的情况,因为除了将可调整大小的孩子调整到他们喜欢的大小之外,它不会执行布局。


您只需将FlowPane更改为Pane即可。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class Exercise0404 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Circle circle = new Circle(50);
        Pane pane = new Pane(circle);

        Scene scene = new Scene(pane);
        circle.centerXProperty().bind(scene.widthProperty().divide(2));
        circle.centerYProperty().bind(scene.heightProperty().divide(2));
        stage.setScene(scene);
        stage.setTitle("Hello");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}