4

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

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

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

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

谢谢

4

1 回答 1

4

对于:
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);
于 2012-06-26T09:28:49.350 回答