JavaFX:当跳转到 TextArea 时,将 caret/cursor 放在 TextArea 的末尾
JavaFX: Place caret/cursor at end of TextArea when tabbing into TextArea
(在 Whosebug 上搜索,我看到这个问题针对 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());
}
}
});
您可以为 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);
您可以简单地使用 Platform.runLater() 将标记移动到文本区域的末尾。这样它将进入 UI 任务队列,并且只有在焦点事件结束后才会执行。
这就是你的做法:
TextArea passageTextArea;
passageTextArea.focusedProperty().addListener((observable, oldValue, newValue) ->
{
if(newValue)
{
Platform.runLater(() -> passageTextArea.end());
}
});
(在 Whosebug 上搜索,我看到这个问题针对 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());
}
}
});
您可以为 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);
您可以简单地使用 Platform.runLater() 将标记移动到文本区域的末尾。这样它将进入 UI 任务队列,并且只有在焦点事件结束后才会执行。 这就是你的做法:
TextArea passageTextArea;
passageTextArea.focusedProperty().addListener((observable, oldValue, newValue) ->
{
if(newValue)
{
Platform.runLater(() -> passageTextArea.end());
}
});