1
让我们假设我们有节点的树,像这样:事件如果在节点的一些树节点被集中
VBox
|
/ \
Pane SplitPane
/ \
HBox Pane
/ \ |
Button Button TextField
什么是最佳的方式(不包括在每个节点上设置监听器)时,任何获得事件这棵树的节点获得焦点?
让我们假设我们有节点的树,像这样:事件如果在节点的一些树节点被集中
VBox
|
/ \
Pane SplitPane
/ \
HBox Pane
/ \ |
Button Button TextField
什么是最佳的方式(不包括在每个节点上设置监听器)时,任何获得事件这棵树的节点获得焦点?
可以使用例如Scene
的focusOwnerProperty
:
场景的当前的焦点所有者节点。
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;
}
非常感谢您的回答。如果我有一个带有多个选项卡的TabPane,并且每个选项卡都有自己的节点树。您如何看待,我应该在每个Tab上创建新场景以使用此类解决方案? –
由于Scene是场景图的根,所以无法将“Scene”添加到“TabPane”(或场景图的任何位置)。 (b)的内容中可以使用当然的方法。您可以在不同的目标“父”上调用相同的方法。 – DVarga
谢谢。我是否理解正确 - 通过'scene.focusOwnerProperty()添加监听器。addListener()'当焦点在树内的任何位置改变时会得到事件? –