JavaFX:在进入 TextArea 时将插入符号/光标放在 TextArea 的末尾

Posted

技术标签:

【中文标题】JavaFX:在进入 TextArea 时将插入符号/光标放在 TextArea 的末尾【英文标题】:JavaFX: Place caret/cursor at end of TextArea when tabbing into TextArea 【发布时间】:2016-09-15 17:14:07 【问题描述】:

(在 *** 上搜索,我看到这个问题针对 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());
        
    
);

【问题讨论】:

【参考方案1】:

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

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

 node.addEventHandler(KeyEvent.ANY, tabListener);

【讨论】:

感谢您的回复。如果用户使用 Tab 键将焦点从 TextArea 移开(例如,通过 Mac 上的 Shift-Tab 或 Ctl-Tab)怎么办?或者,如果他们在 TextArea 中工作时使用 Tab 来缩进他们正在输入的段落怎么办?这些情况也会触发这个 Listener 吗? 由于您没有将侦听器添加到TextArea,因此在TextArea 聚焦时按Tab 键将照常工作。要将焦点从 TextArea 移开,您必须将 isShiftDown 添加到 if 子句【参考方案2】:

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

TextArea passageTextArea;

passageTextArea.focusedProperty().addListener((observable, oldValue, newValue) ->

    if(newValue)
    
        Platform.runLater(() -> passageTextArea.end());
    
);

【讨论】:

以上是关于JavaFX:在进入 TextArea 时将插入符号/光标放在 TextArea 的末尾的主要内容,如果未能解决你的问题,请参考以下文章

如何在 setText 之后滚动 JavaFX TextArea

JavaFX - TextArea 的掩码文本

JavaFX - 限制 TextArea 行?

javafx 8在textarea中编辑文本

JavaFX TextArea onChange 事件

“textarea”中的 JavaFX 8 计数行