zorgbargle
zorgbargle

Reputation: 730

How do I restrict keyboard focus to controls within a Node?

I'm trying to implement a reusable method for displaying a node as a lightweight dialog. The node is added to the top of a StackPane while the background is then blurred. There are 2 problems:

1) Controls in the background node of the stackpane are still able to receive focus.

2) How do I give focus to the top-level node. I know there is a requestFocus method on Node, but I need to give it to a control nested within the node. Since this is intended to be a reusable method, I can't reference the controls directly.

(if I can sidestep the whole problem by finding an existing implementation, that would be best, but I haven't found a 3rd party solution yet)

Thanks

Upvotes: 3

Views: 4339

Answers (1)

Uluk Biy
Uluk Biy

Reputation: 49185

For:
1) 3 alternative suggestions,
a- Add a key event handler to the dialogbox pane to catch the Tab key pressings

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- Temporarily disable all children of the main StackPane except the lastly added dialogbox child.

// 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- Same as b but manually disable focusing to controls by node.setFocusTraversable(false) (spot kick). Surely this will not be your choice..

2) Tell the dialogbox which node should take the focus after the dialog is shown (through constructor or setter method).

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

Upvotes: 3

Related Questions