【问题标题】:How can I determine the layering of panes in JavaFX如何确定 JavaFX 中窗格的分层
【发布时间】:2015-01-09 15:13:40
【问题描述】:

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

例如,我有以下内容:

//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();

但我似乎找不到确定当前位于顶部的层的能力。

即

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

甚至

boolean onTop = layer1.isOnTop();

有没有办法确定节点的位置,这样当工作区打开时,前面板可以再次可见?

谢谢!

【问题讨论】:

    标签: nodes javafx-8 pane


    【解决方案1】:

    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.
            }
        }
    });   
    

    【讨论】:

    • 实际上 - 它比我想象的要简单。只需基于 pane.getChildren() 创建一个 JSON 节点,即可以正确的顺序导出它们。所以我不需要知道哪一层是哪一层。但是您的解决方案也可以。
    【解决方案2】:

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

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

    workspace.getChildren().addListener((Change change) -> { });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      相关资源
      最近更新 更多