将Rectangle.widthProperty()绑定到其父宽度不起作用

时间:2015-03-06 22:32:06

标签: java javafx

我想在HBox的中间放置一个带有红色矩形的BorderPane,我希望该矩形能够与其容器(HBox)一起增长或缩小。 这是我的代码:

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) {
        BorderPane borderPane = new BorderPane();
        HBox hBox = new HBox();

        hBox.setAlignment(Pos.CENTER);

        Rectangle rect = new Rectangle(hBox.getWidth(),50);
        rect.setFill(Color.RED);
        rect.widthProperty().bind(hBox.widthProperty().subtract(20));

        hBox.getChildren().add(rect);

        borderPane.setCenter(hBox);     

        Scene scene = new Scene(borderPane, 900, 600, Color.WHITE);

        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

但它不起作用。当我慢慢地调整框架的大小时,它会工作,但是,当我快速调整框架的大小时,矩形不在中间(也不是相同的尺寸),当我们最小化和最大化框架时,我们可以看到相同的东西。

我不明白为什么它不起作用。

1 个答案:

答案 0 :(得分:2)

这就是发生的事情:

在布局期间询问rect首选/最小/最大宽度时,它会回复当前宽度,即调整大小之前的宽度,因为到那时hBox还没有调整大小。因此,hBox的最小宽度报告为其当前宽度减去20.因此,当您缩小窗口时,hBox仍将调整为其先前宽度减去20

有多种方法可以解决此问题,但更准确的答案取决于您尝试执行的操作,并且可能涉及使用Region代替Rectangle或覆盖{ {1}}矩形的父级方法。

这是一种接近现在的方式。它定义了一个可调整大小的矩形,并将其最小宽度覆盖为0.0,因此可以缩小HBox的尺寸。

layoutChildren