JavaFX TextArea의 Tab 키 탐색


Answers

나는 트래버스 방법을 사용한다.

@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();
    }
}
Question

TextArea의 Tab 키를 눌러 다음 컨트롤로 이동하려면 어떻게해야합니까?

나는 캐스 드 키 눌려진 이벤트에 청취자를 추가 할 수 있지만 초점을 잃을 테그 TextArea 컨트롤을 만드는 방법은 무엇입니까 (포커스가있는 체인의 다음 필드를 모른 채)?

@FXML protected void handleTabKeyTextArea(KeyEvent event) {
    if (event.getCode() == KeyCode.TAB) {
        ...
    }
}



이전 답변에서 영감을 얻은 것과 매우 유사한 경우에 대해 다음과 같은 클래스를 만들었습니다.

/**
 * Handles tab/shift-tab keystrokes to navigate to other fields,
 * ctrl-tab to insert a tab character in the text area.
 */
public class TabTraversalEventHandler implements EventHandler<KeyEvent> {
    @Override
    public void handle(KeyEvent event) {
        if (event.getCode().equals(KeyCode.TAB)) {
            Node node = (Node) event.getSource();
            if (node instanceof TextArea) {
                TextAreaSkin skin = (TextAreaSkin) ((TextArea)node).getSkin();
                if (!event.isControlDown()) {
                    // Tab or shift-tab => navigational action
                    if (event.isShiftDown()) {
                        skin.getBehavior().traversePrevious();
                    } else {
                        skin.getBehavior().traverseNext();
                    }
                } else {
                    // Ctrl-Tab => insert a tab character in the text area
                    TextArea textArea = (TextArea) node;
                    textArea.replaceSelection("\t");
                }
                event.consume();
            }
        }
    }
}

TextField의 컨텍스트에서 탭 처리의 필요성을 보지 못했기 때문에이 부분을 제거했습니다.

그렇다면이 클래스는 사용자가 설명한 것처럼 매우 쉽게 사용할 수 있습니다.

TextArea myTextArea = new TextArea();
mytTextArea.addEventFilter(KeyEvent.KEY_PRESSED, new TabTraversalEventHandler());

그리고 모든 것은 매력처럼 작동합니다 :)




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) { }
        }
    }

이것은 또한 작동합니다 :

@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);            
        }
    }

둘 다 사용자가 TAB 누를 때 CTRL+TAB 눌러 시뮬레이션합니다. CTRL+TAB 에 대한 TextArea의 기본 동작은 포커스를 다음 컨트롤로 이동하는 것입니다. 두 번째 코드는 Johan De Schutter의 대답을 기반으로합니다.