JavaFX:当Tabed到TextArea时,将插入/光标放在TextArea的末尾

时间:2016-05-19 02:02:45

标签: javafx textarea changelistener

(在stackoverflow上搜索,我看到这个问题针对Javascript而不是JavaFX)

我有一个TextArea,它实际上是类似文字处理器的应用程序中的主要文本编辑器(即,我打算让用户花费大量时间在这个TextArea中工作)。当用户选中TextArea时,我希望将光标放在TextArea的末尾,以便用户可以从他们上次输入的内容结束时继续编辑。

我使用ChangeListener(下面的代码)实现了它,它具有所需的行为。但是,由于光标位于TextArea 每个时间的末尾,因此获得焦点,然后如果我要切换应用程序然后切换回来,光标就会移动。例如,如果用户在TextArea中间某处键入一个句子,切换到阅读电子邮件,然后切换回来找到他们的光标已经移动,这就不方便了。

是否有焦点遍历策略执行此操作或以其他方式实现此操作,以便仅当用户选中TextArea时光标才会移动到末尾?在我看来,这通常是需要的行为:每当TextArea被选中时,光标总是出现在TextArea的末尾,但是否则光标保持不动。

TextArea passageTextArea;

passageTextArea.focusedProperty().addListener(new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue)
    {
        if (newValue.booleanValue()) {
            passageTextArea.positionCaret(passageTextArea.getText().length());
        }
    }
});

2 个答案:

答案 0 :(得分:7)

您可以为EventHandler添加KeyEvent,当您按下Tab键时,它会将插入符号移到文本的末尾:

 EventHandler<KeyEvent> tabListener = evt -> {
            if (evt.getCode() == KeyCode.TAB && !evt.isShiftDown()) {
                evt.consume();
                passageTextArea.requestFocus();
                passageTextArea.end();
            }
        };

 node.addEventHandler(KeyEvent.ANY, tabListener);

答案 1 :(得分:1)

您可以简单地使用Platform.runLater()将标记移动到textArea的末尾。这样,它将进入UI任务队列,并且仅在焦点事件结束后才执行。 这是您的操作方式:

val subresult = costlyGetter()
val result = subresult ?: "default"