(在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());
}
}
});
答案 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"