2017-05-09 73 views
1

让我们假设我们有节点的树,像这样:事件如果在节点的一些树节点被集中

  VBox 
      | 
     / \ 
     Pane SplitPane 
    /   \ 
    HBox    Pane 
/ \    | 
Button Button TextField 

什么是最佳的方式(不包括在每个节点上设置监听器)时,任何获得事件这棵树的节点获得焦点?

回答

1

可以使用例如ScenefocusOwnerProperty

场景的当前的焦点所有者节点。

scene.focusOwnerProperty().addListener((obs, oldval, newval) -> 
     System.out.println(checkFocus(vbox))); 

其中checkFocus检查递归节点的focusedProperty源于VBox

private boolean checkFocus(Parent p) { 
    if (!p.isFocused()) { 
     for (Node node :p.getChildrenUnmodifiable()) { 
      if (node instanceof Parent && checkFocus((Parent) node)) 
       return true; 
      else if (node.isFocused()) 
       return true; 
     } 
    } else 
     return true; 

    return false; 
} 
+0

非常感谢您的回答。如果我有一个带有多个选项卡的TabPane,并且每个选项卡都有自己的节点树。您如何看待,我应该在每个Tab上创建新场景以使用此类解决方案? –

+0

由于Scene是场景图的根,所以无法将“Scene”添加到“TabPane”(或场景图的任何位置)。 (b)的内容中可以使用当然的方法。您可以在不同的目标“父”上调用相同的方法。 – DVarga

+0

谢谢。我是否理解正确 - 通过'scene.focusOwnerProperty()添加监听器。addListener()'当焦点在树内的任何位置改变时会得到事件? –