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 setloginButton.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 setloginButton.resize(200.00,50.0)
,也应用了setManaged(false)
,bindLayoutX不工作,为什么会这样?