JavaFX绑定layoutY:无法设置绑定值

时间:2017-06-10 15:25:43

标签: java layout javafx binding

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

所以,我没有申请任何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);它不会给出异常,但按钮不再可见。

1 个答案:

答案 0 :(得分:2)

所有布局窗格(例如AnchorPane)都会根据您应用于窗格和子窗口的配置来管理其托管子节点的布局。他们通过设置layoutXlayoutY属性来完成此操作。换句话说,锚窗格本身正在调用loginButton.setLayoutY(...),如果绑定layoutY属性,则会出现异常。

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

底线是你不应该使用绑定来执行布局。使用现有布局窗格管理节点的布局(位置和大小)。本教程有一个overview of the layout panes。如果你真的找不到布局窗格和设置的组合来为你提供所需的布局(这是非常不可能的),定义自定义布局的方法是子类Pane并实现你自己的{{ 1}}方法。要使用此方法,您可以先查看现有窗格的implemented

如果您希望按钮位于窗格底部,只需告诉锚定窗格将其放置在那里。用

替换绑定
layoutChildren()