В то время, когда этот код запускает высоту и ширину равны нулю, так как я предполагаю, что узел еще не был размечен.
, если вы хотите middleX
Привязки, middleY
и coordX
для обновления с текущей шириной / высотой, тогда вам нужно привязать их к свойствам / привязкам ширины к высоте, а не только к ширине / высоте при одном вызове, который вы делаете "source.getWidth() / 2.0
", когдаэто ноль.
Попробуйте это:
// Middlepoint X source and target node
NumberBinding middleX = source.layoutXProperty().divide(2)
.add(target.layoutXProperty().divide(2).add(source.widthProperty().divide(2)));
// Middlepoint Y source and target node
NumberBinding middleY = source.layoutYProperty().divide(2)
.add(target.layoutYProperty().divide(2).add(source.heightProperty().divide(2)));
// X position of the anchorPane
// Middlepoint X - anchor.getWidth()/2
NumberBinding coordX = middleX.subtract(anchor_link_label.widthProperty().divide(2));
// anchor_link_label.layoutXProperty().bind(coordX);
// anchor_link_label.layoutYProperty().bind(middleY);
// To avoid binding and getting a "bound value cannot be set" error
// you can just use listeners instead.
// However, this is slightly hackish, since you are re-laying-out this child
// after the parent tries to lay it out already.
// What you probably should do is define a parent that overrides
// `layoutChildren()` and determines how to layout this node.
// Here are the listeners:
coordX.addListener((obs, oldVal, newVal) -> {
anchor_link_label
.setLayoutX(
newVal.doubleValue() - anchor_link_label.getLayoutBounds().getMinX());
});
middleY.addListener((obs, oldVal, newVal) -> {
anchor_link_label
.setLayoutY(
newVal.doubleValue() - anchor_link_label.getLayoutBounds().getMinY());
});
Возможной альтернативой будет использование HBox
в качестве родителя и установка выравнивания по центру, а не использование универсального Pane
так как кажется, что все, что вам действительно нужно, это поместить ярлык в центр панели.