【问题标题】:How do I restrict keyboard focus to controls within a Node?如何将键盘焦点限制在节点内的控件上?
【发布时间】:2012-06-27 16:52:18
【问题描述】:

我正在尝试实现一种可重用的方法来将节点显示为轻量级对话框。该节点被添加到 StackPane 的顶部,而背景随后被模糊。有两个问题:

1) 堆栈窗格背景节点中的控件仍然能够接收焦点。

2) 如何将焦点放在顶级节点。我知道 Node 上有一个 requestFocus 方法,但我需要将它交给嵌套在节点内的控件。由于这是一种可重复使用的方法,因此我无法直接引用控件。

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

谢谢

【问题讨论】:

    标签: javafx-2


    【解决方案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);
    

    【讨论】:

    • 感谢您的所有建议。就我而言, b 似乎效果最好。对于(2),我想我可以使用构建器模式来执行您的建议。理想情况下,虽然我希望像 Swing 的 KeyboardFocusManager 这样的东西,但我会将你的答案标记为“正确”,因为这似乎是实现我现在需要的唯一方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 2011-11-18
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多