如何限制一个节点内的键盘焦点控制?(How do I restrict keyboard focus

2019-07-30 03:02发布

我试图实现对显示节点作为一个轻量级的对话框中可重复使用的方法。 该节点被添加到StackPane的顶部,同时背景然后模糊。 有2个问题:

1)在stackpane的背景节点控制仍然能够接收焦点。

2)如何提供焦点顶级节点。 我知道有节点A requestFocus的方法,但我需要给它嵌套在节点内的控制。 由于这是旨在是可重复使用的方法,我不能直接引用的控件。

(如果我可以回避通过寻找现有的实现问题的全部,那将是最好的,但我还没有找到一个第三方的解决方案还)

谢谢

Answer 1:

对于:
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-B相同但手动禁用通过聚焦于对照node.setFocusTraversable(false) (点球)。 当然这不会是你的选择..

2)给该节点应该采取的焦点所示的对话框后(通过构造或setter方法)的对话框。

// init dialogbox and show it then
dialogbox.setFocusTo(node_in_dialogbox);


文章来源: How do I restrict keyboard focus to controls within a Node?
标签: javafx-2