我正在尝试实现一种可重用的方法来将节点显示为轻量级对话框。该节点被添加到 StackPane 的顶部,而背景随后被模糊。有2个问题:
1) 堆栈窗格的后台节点中的控件仍然能够接收焦点。
2)如何将焦点放在顶级节点。我知道 Node 上有一个 requestFocus 方法,但我需要将它交给嵌套在节点内的控件。由于这是一种可重用的方法,因此我不能直接引用控件。
(如果我可以通过找到现有的实现来回避整个问题,那将是最好的,但我还没有找到第 3 方解决方案)
谢谢
我正在尝试实现一种可重用的方法来将节点显示为轻量级对话框。该节点被添加到 StackPane 的顶部,而背景随后被模糊。有2个问题:
1) 堆栈窗格的后台节点中的控件仍然能够接收焦点。
2)如何将焦点放在顶级节点。我知道 Node 上有一个 requestFocus 方法,但我需要将它交给嵌套在节点内的控件。由于这是一种可重用的方法,因此我不能直接引用控件。
(如果我可以通过找到现有的实现来回避整个问题,那将是最好的,但我还没有找到第 3 方解决方案)
谢谢
对于:
1) 3 个替代建议,
a-在对话框窗格中添加一个键事件处理程序以捕获Tab按键
dialogbox.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(javafx.scene.input.KeyEvent event) {
if (event.getCode() == KeyCode.TAB) {
System.out.println("TAB pressed");
event.consume(); // do nothing
}
}
});
b-暂时禁用StackPane
除最后添加的对话框子项之外的所有子项。
// Assuming dialogbox is at last in the children list
for(int i=0; i<mainPane.getChildren().size()-1; i++){
// Disabling will propagate to sub children recursively
mainPane.getChildren().get(i).setDisable(true);
}
c-与bnode.setFocusTraversable(false)
相同,但通过(spot kick)手动禁用对控件的对焦。当然这不会是你的选择..
2)告诉对话框显示对话框后哪个节点应该获得焦点(通过构造函数或setter方法)。
// init dialogbox and show it then
dialogbox.setFocusTo(node_in_dialogbox);