2

我想保留一个工作区,然后在用户第二次打开窗口时恢复它。

例如,我有以下内容:

//Create the workspace there the panes will live
Pane workspace = new Pane();
//Create the layers - assume there is code to allow these to be dragged and moved
Pane layer1 = new Pane();
Pane layer2 = new Pane();
Pane layer3 = new Pane();

workspace.getChildren().addAll(layer1, layer2, layer3);

我知道我可以通过执行以下操作来选择位于顶部的图层:

layer2.toFront();

但是,我似乎无法找到确定当前位于顶部的图层的能力。

IE

layer1.setOnToFront(event -> {});
layer1.setOnToBack(event -> {});

甚至

boolean onTop = layer1.isOnTop();

有没有办法确定一个节点在哪里,所以当工作区打开时,前面板可以再次可见?

谢谢!

4

2 回答 2

4

Pane中节点的呈现顺序(从后到前)基于窗格子列表中节点的索引。

因此,您可以使用以下函数确定给定节点的索引:

int idx = pane.getChildren().indexOf(layerX);

您可以使用以下方法确定顶部节点:

Node top = 
    pane.getChildren.size() > 0
        ? pane.getChildren().get(pane.getChildren().size() - 1)
        : null;

您可以使用ListChangeListener监听节点顺序的变化:

pane.getChildren().addListener(new ListChangeListener<Item>() {
    public void onChanged(Change<Item> c) {
        while (c.next()) {
            // process the next change.
        }
    }
});   
于 2015-01-09T15:36:57.467 回答
1

toFront()简单地通过重新排序父节点的子节点列表将节点移动到前面(具体来说,它将节点移动到列表中的最后一个位置)。

所以你可以简单地通过查看来确定顺序workspace.getChildren()。如果您想在订单更改时收到通知,只需在列表中注册一个侦听器:

workspace.getChildren().addListener((Change change) -> { });
于 2015-01-09T15:34:31.153 回答