JavaFX TextArea中的Tab键导航

nai*_*jed 14 java user-interface javafx javafx-2

如何在TextArea中按Tab键导航到下一个控件?

我可以为cath de key按下事件添加一个监听器,但是如何让textArea控件失去焦点(不知道要聚焦的链中的下一个字段)?

@FXML protected void handleTabKeyTextArea(KeyEvent event) {
    if (event.getCode() == KeyCode.TAB) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 13

我使用遍历方法

@Override
public void handle(KeyEvent event) {
    if (event.getCode().equals(KeyCode.TAB)) {
        Node node = (Node) event.getSource();
        if (node instanceof TextField) {
            TextFieldSkin skin = (TextFieldSkin) ((TextField)node).getSkin();
            if (event.isShiftDown()) {
                skin.getBehavior().traversePrevious();
            }
            else {
                skin.getBehavior().traverseNext();
            }               
        }
        else if (node instanceof TextArea) {
            TextAreaSkin skin = (TextAreaSkin) ((TextArea)node).getSkin();
            if (event.isShiftDown()) {
                skin.getBehavior().traversePrevious();
            }
            else {
                skin.getBehavior().traverseNext();
            }
        }

        event.consume();
    }
}
Run Code Online (Sandbox Code Playgroud)


amr*_*mru 9

如果按TAB键,则此代码遍历焦点,如果按CONTROL + TAB,则插入选项卡

textArea.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            if (event.getCode() == KeyCode.TAB) {
                SkinBase skin = (SkinBase) textArea.getSkin();
                if (skin.getBehavior() instanceof TextAreaBehavior) {
                    TextAreaBehavior behavior = (TextAreaBehavior) skin.getBehavior();
                    if (event.isControlDown()) {
                        behavior.callAction("InsertTab");
                    } else {
                        behavior.callAction("TraverseNext");
                    }
                    event.consume();
                }

            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 至少对于JavaFX 8,应该将SkinBase更改为TextAreaSkin. (6认同)
  • 一个小问题:它应该检查event.isShiftDown(),它应该调用"TraversePrevious",而不是"TraverseNext". (5认同)

Mar*_*rcG 6

从Java 9(2017)开始,此页面中的大多数答案都不起作用,因为您不能再这样做skin.getBehavior()了.

这有效:

@Override
public void handle(KeyEvent event) {
    KeyCode code = event.getCode();

    if (code == KeyCode.TAB && !event.isShiftDown() && !event.isControlDown()) {
        event.consume();
        Node node = (Node) event.getSource();
        try {
            Robot robot = new Robot();
            robot.keyPress(KeyCode.CONTROL.getCode());
            robot.keyPress(KeyCode.TAB.getCode());
            robot.delay(10);
            robot.keyRelease(KeyCode.TAB.getCode());
            robot.keyRelease(KeyCode.CONTROL.getCode());
            }
        catch (AWTException e) { }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这也有效:

@Override
public void handle(KeyEvent event) {
    KeyCode code = event.getCode();

    if (code == KeyCode.TAB && !event.isShiftDown() && !event.isControlDown()) {
        event.consume();
        Node node = (Node) event.getSource();            
        KeyEvent newEvent 
          = new KeyEvent(event.getSource(),
                     event.getTarget(), event.getEventType(),
                     event.getCharacter(), event.getText(),
                     event.getCode(), event.isShiftDown(),
                     true, event.isAltDown(),
                     event.isMetaDown());

        node.fireEvent(newEvent);            
        }
    }
Run Code Online (Sandbox Code Playgroud)

CTRL+TAB当用户按下时,两者都模拟按下TAB.TextArea的默认行为CTRL+TAB是将焦点移动到下一个控件.请注意,第二个代码基于Johan De Schutter的答案.