在BorderPane中重新加载中心FXML后,TOP和BOTTOM的阴影消失

时间:2016-10-23 12:40:27

标签: javafx

我在BorderPane重新加载中心FXML后出现问题。

此操作后,topbottom元素中的投影将消失。 我说我必须首先加载中心FXML。

方法。 toFront()toBack()抛出NullPointerException

如何重新加载其中一个元素并保护其他人的阴影?

1 个答案:

答案 0 :(得分:0)

不会从topbottom元素中删除投影。相反,新的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);