2017-06-10 2 views
0

Diese Frage bezieht sich nicht auf die anderen, da ich nicht versuche, layoutY-Wert mit einem bereits festgelegten Begrenzungswert festzulegen.JavaFX BindungslayoutY: Ein gebundener Wert kann nicht festgelegt werden

Also, ich habe keine loginButton.setLayoutY(); angewendet.

Allerdings, wenn ich loginButton.layoutYProperty().bind(anchorPane.prefHeightProperty()); setzen dann habe ich diese Ausnahme:

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

Wenn ich loginButton.setManaged(false); gesetzt es tut eine Ausnahme geben, aber die Taste nicht mehr sichtbar ist.

Antwort

2

Alle Layoutbereiche, z. B. AnchorPane, verwalten das Layout ihrer verwalteten untergeordneten Knoten gemäß der Konfiguration, die Sie auf den Bereich und die untergeordneten Elemente anwenden. Sie tun dies, indem sie die Eigenschaften layoutX und layoutY einstellen. Mit anderen Worten, der Ankerbereich selbst ruft loginButton.setLayoutY(...) auf, was zu der Ausnahme führt, die Sie sehen, wenn Sie die layoutY-Eigenschaft binden.

Wenn Sie setManaged(false) aufrufen, versucht der Ankerbereich nicht, die loginButton zu positionieren oder die Größe zu ändern, und Sie erhalten keine Ausnahme. Beachten Sie, dass Ihre Bindung den oberen Teil der Anmeldeschaltfläche (ihre layoutY-Eigenschaft) auf der Höhe des Ankerfensters, dh ganz unten im Ankerfenster, und der Schaltfläche positioniert, wenn der Ankerbereich auf die bevorzugte Größe festgelegt wird außerhalb der Grenzen des Ankerfensters sein. Daher wird es nicht sichtbar sein. Sie müssen die Schaltfläche auch explizit skalieren, indem Sie loginButton.resize(...) verwenden.

Die Quintessenz ist, dass Sie keine Bindungen verwenden sollten, um das Layout durchzuführen. Verwenden Sie die vorhandenen Layoutfenster, um das Layout (Position und Größe) Ihrer Knoten zu verwalten. Das Tutorial hat eine overview of the layout panes. Wenn Sie wirklich keine Kombination von Layoutfenstern und Einstellungen finden, die Ihnen das gewünschte Layout geben (was sehr unwahrscheinlich ist), können Sie ein benutzerdefiniertes Layout definieren, indem Sie Pane ableiten und Ihre eigene layoutChildren()-Methode implementieren. Um diesen Ansatz zu verwenden, können Sie zunächst prüfen, wie die vorhandenen Bereiche implemented sind.

Wenn Sie möchten, dass sich die Schaltfläche am unteren Rand des Fensters befindet, sagen Sie dem Ankerfenster, dass er dort positioniert werden soll. Ersetzen Sie die Bindung mit

AnchorPane.setBottomAnchor(loginButton, 0.0); 
+0

Thx für die Antwort, ich habe es über AnchorPane, aber ich nicht noch über setManaged (false) verstehen, habe ich einen beliebigen Wert layoutY und layoutX bande die Buttom im Layout erscheinen. – Marckaraujo

+0

@Marckaraujo Wenn Sie 'managed' auf' false' setzen, wird wahrscheinlich auch die Größe der Schaltfläche nicht festgelegt. Versuchen Sie auch, 'resize()' aufzurufen. Aber Sie sollten die Dinge nicht wirklich so machen: Verwenden Sie die Layout-Fenster so, wie sie verwendet werden sollen. –

+0

@Marckaraujo Hinzugefügt Erwähnung der Größe der Antwort. –

Verwandte Themen