我在BorderPane
重新加载中心FXML后出现问题。
此操作后,top
和bottom
元素中的投影将消失。
我说我必须首先加载中心FXML。
方法。 toFront()
或toBack()
抛出NullPointerException
。
如何重新加载其中一个元素并保护其他人的阴影?
答案 0 :(得分:0)
不会从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);