ドロップシャドウはtop
とbottom
要素から削除されません。代わりに新しいcenter
が子リストの最後に追加されるため、ドロップシャドウを隠す他の子の上に描画されます。順序を保持するには、正しい順序で子を再度追加する必要があります。これは、この小さなヘルパークラスを使用して行うことができます
public class BorderPaneReloadHelper {
private List<ObjectProperty<Node>> permutation;
public void before(BorderPane pane) {
// get pane properties sorted by
final List<Node> children = pane.getChildren();
permutation = Arrays.asList(pane.topProperty(), pane.leftProperty(), pane.bottomProperty(), pane.rightProperty(), pane.centerProperty());
permutation.sort(Comparator.comparingInt(p -> children.indexOf(p.get())));
}
public void after(BorderPane pane) {
// before and after have to be called with the same argument
if (permutation == null || permutation.get(0).getBean() != pane) {
throw new IllegalStateException("no corresponding before call");
}
Node[] nodes = permutation.stream().map(ObjectProperty::get).toArray(Node[]::new);
pane.getChildren().removeAll(nodes);
for (int i = 0; i < nodes.length; i++) {
Node node = nodes[i];
if (node != null) {
permutation.get(i).set(node);
}
}
// restore initial state to allow reuse of class
permutation = null;
}
}
それは次のように使用することができます:
BorderPaneReloadHelper helper = new BorderPaneReloadHelper();
helper.before(container);
... replace center...
helper.after(container);