Как изменить положение курсора в 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(), показанный выше.

Другие вопросы по тегам