这个问题与其他问题无关,因为我没有尝试设置已设置绑定值的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);
它不会给出异常,但按钮不再可见。
答案 0 :(得分:2)
所有布局窗格(例如AnchorPane
)都会根据您应用于窗格和子窗口的配置来管理其托管子节点的布局。他们通过设置layoutX
和layoutY
属性来完成此操作。换句话说,锚窗格本身正在调用loginButton.setLayoutY(...)
,如果绑定layoutY
属性,则会出现异常。
如果您致电setManaged(false)
,则锚定窗格将不会尝试定位或调整loginButton
的大小,并且您不会获得异常。请注意,如果锚定窗格的大小设置为其首选大小,则绑定会将登录按钮的顶部(其layoutY
属性)定位在锚定窗格的高度,即锚定窗格的最底部,并且按钮将位于锚定窗格的边界之外。因此它将不可见。您还需要使用loginButton.resize(...)
明确调整按钮的大小。
底线是你不应该使用绑定来执行布局。使用现有布局窗格管理节点的布局(位置和大小)。本教程有一个overview of the layout panes。如果你真的找不到布局窗格和设置的组合来为你提供所需的布局(这是非常不可能的),定义自定义布局的方法是子类Pane
并实现你自己的{{ 1}}方法。要使用此方法,您可以先查看现有窗格的implemented。
如果您希望按钮位于窗格底部,只需告诉锚定窗格将其放置在那里。用
替换绑定layoutChildren()