JavaFX Bind layoutY : 无法设置绑定值



这个问题与其他问题无关,因为我没有尝试设置已经设置绑定值的布局Y值。

所以,我没有应用任何loginButton.setLayoutY();

但是,如果我设置loginButton.layoutYProperty().bind(anchorPane.prefHeightProperty());那么我得到了这个异常:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: Button.layoutY : A bound value cannot be set.

如果我设置loginButton.setManaged(false);它不会给出异常,但是按钮不再可见。

所有布局窗格(如AnchorPane)都根据应用于窗格和子节点的配置管理其受管子节点的布局。他们通过设置layoutXlayoutY属性来实现此目的。换句话说,锚窗格本身正在调用loginButton.setLayoutY(...),从而导致在绑定layoutY属性时看到的异常。

如果调用setManaged(false),则定位点窗格不会尝试定位loginButton或调整其大小,并且您不会收到异常。请注意,如果锚窗格的大小为其首选大小,则绑定会将登录按钮的顶部(其layoutY属性)定位在锚点窗格的高度,即锚点窗格的最底部,并且按钮将位于锚点窗格的边界之外。因此,它将不可见。您还需要使用loginButton.resize(...)显式调整按钮大小。

底线是不应使用绑定来执行布局。使用现有布局窗格管理节点的布局(位置和大小)。本教程概述了布局窗格。如果您确实找不到布局窗格及其上的设置的组合,以提供所需的布局(这是极不可能的),则定义自定义布局的方法是子类Pane并实现您自己的layoutChildren()方法。若要使用此方法,可以首先查看现有窗格的实现方式。

如果希望按钮位于窗格底部,只需告诉锚点窗格将其定位在那里即可。将绑定替换为

AnchorPane.setBottomAnchor(loginButton, 0.0);

最新更新