JavaFX绑定布局:无法设置绑定值

JavaFX绑定布局:无法设置绑定值,java,layout,javafx,binding,Java,Layout,Javafx,Binding,这个问题与其他问题无关,因为我不想用已经设置的绑定值来设置布局值 因此,我没有任何loginButton.setLayoutY()已应用 但是,如果我设置了loginButton.layoutYProperty().bind(ancorpane.prefHeightProperty())然后我得到了这个异常: Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: Button.layoutY : A

这个问题与其他问题无关,因为我不想用已经设置的绑定值来设置布局值

因此,我没有任何
loginButton.setLayoutY()已应用

但是,如果我设置了
loginButton.layoutYProperty().bind(ancorpane.prefHeightProperty())然后我得到了这个异常:

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

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

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

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

底线是您不应该使用绑定来执行布局。使用现有布局窗格管理节点的布局(位置和大小)。本教程有一个简单的例子。如果您真的找不到布局窗格和设置的组合来提供所需的布局(这是不太可能的),那么定义自定义布局的方法是将
窗格
子类化,并实现您自己的
layoutChildren()
方法。要使用这种方法,可以从查看现有窗格的外观开始

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

AnchorPane.setBottomAnchor(loginButton, 0.0);

所有布局窗格(例如,
AnchorPane
)都根据应用于窗格及其子节点的配置来管理其受管子节点的布局。他们通过设置
layoutX
layoutY
属性来实现这一点。换句话说,锚窗格本身正在调用
loginButton.setLayoutY(…)
,这会导致绑定
layoutY
属性时出现异常

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

底线是您不应该使用绑定来执行布局。使用现有布局窗格管理节点的布局(位置和大小)。本教程有一个简单的例子。如果您真的找不到布局窗格和设置的组合来提供所需的布局(这是不太可能的),那么定义自定义布局的方法是将
窗格
子类化,并实现您自己的
layoutChildren()
方法。要使用这种方法,可以从查看现有窗格的外观开始

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

AnchorPane.setBottomAnchor(loginButton, 0.0);

Thx对于答案,我得到了关于AnchorPane的答案,但我仍然不理解setManaged(false),我将任何值设置为layoutY和layoutX,按钮不会出现在布局中。@Marckaraujo如果您将
managed
设置为
false
,则可能也不会设置按钮的大小。尝试调用
resize()
。但是你真的不应该一开始就这样做:按预期的方式使用布局窗格。@Marckaraujo在回答中提到了大小。是的,对我来说最好的办法是将
AnchorPane
更改为
Pane
,这样它就不会设置布局属性,也不需要
setManaged(false)
。Thanksafter I set
loginButton.resize(200.00,50.0)
,也应用了
setManaged(false)
,bindLayoutX不起作用,为什么会这样?Thx的答案是,我得到了关于AnchorPane的信息,但我仍然不理解setManaged(false),我将任何值设置为layoutY和layoutX,按钮不会出现在布局中。@Marckaraujo如果你将
managed
设置为
false
,它可能也没有设置按钮的大小。尝试调用
resize()
。但是你真的不应该一开始就这样做:按预期的方式使用布局窗格。@Marckaraujo在回答中提到了大小。是的,对我来说最好的办法是将
AnchorPane
更改为
Pane
,这样它就不会设置布局属性,也不需要
setManaged(false)
。Thanksafter I set
loginButton.resize(200.00,50.0)
,也应用了
setManaged(false)
,bindLayoutX不工作,为什么会这样?