Как изменить положение курсора в TextArea
Я установил некоторый текст в JTextArea
, Курсор находится в 5-й строке. Теперь я хочу установить текст в первой строке.
Так можно ли переместить курсор на нужную строку?
2 ответа
Использование JTextComponent.setCaretPosition(int)
который:
Устанавливает позицию вставки текста для TextComponent. Обратите внимание, что каретки изменяются, поэтому они могут двигаться, если изменяется основной текст компонента. Если документ
null
, ничего не делает. Позиция должна быть между 0 и длиной текста компонента, иначе выдается исключение.
Если вы хотите перейти от одной фактической текстовой строки к другой текстовой строке, вам все равно нужно использовать метод JTextComponent.setCaretPosition(), но вам также потребуется средство для получения нужного начального индекса строки для передачи в JTextComponent.setCaretPosition. () метод. Вот как вы можете получить начальный индекс любого предоставленного номера строки при условии, что предоставленный номер строки существует в документе:
public int getLineStartIndex(JTextComponent textComp, int lineNumber) {
if (lineNumber == 0) { return 0; }
// Gets the current line number start index value for
// the supplied text line.
try {
JTextArea jta = (JTextArea) textComp;
return jta.getLineStartOffset(lineNumber-1);
} catch (BadLocationException ex) { return -1; }
}
Как вы можете использовать вышеуказанный метод (скажем, из события ActionPerformed JButton):
int index = getLineStartIndex(jTextArea1, 3);
if (index != -1) {
jTextArea1.setCaretPosition(index);
}
jTextArea1.requestFocus();
Приведенный выше пример использования кода переместит курсор (из любого места, в котором он находится в документе) в начало строки 3 в том же документе.
РЕДАКТИРОВАТЬ: на основе вопроса в комментариях...
Чтобы переместить курсор в конец строки, вы можете сделать еще один метод, очень похожий на метод getLineStartIndex(), описанный выше, за исключением того, что теперь мы назовем его getLineEndIndex() и сделаем одно изменение строки кода:
public int getLineEndIndex(JTextComponent textComp, int lineNumber) {
if (lineNumber == 0) { return 0; }
// Gets the current line number end index value for
// the supplied text line.
try {
JTextArea jta = (JTextArea) textComp;
return jta.getLineEndOffset(lineNumber-1) - System.lineSeparator().length();
} catch (BadLocationException ex) { return -1; }
}
Используйте этот метод так же, как метод getLineStartIndex(), показанный выше.