如何在 JTextArea 中重新定位光标

Anu*_*ool 1 java swing jtextcomponent

我已经在 中设置了一些文本JTextArea。光标位于第 5 行。现在我想在第一行设置一些文本。

那么是否可以将光标重新定位到所需的行呢?

And*_*son 5

使用JTextComponent.setCaretPosition(int)哪个:

设置TextComponent 的文本插入插入符的位置。请注意,插入符号会跟踪更改,因此如果组件的基础文本发生更改,插入符号可能会移动。如果文档是null,则不执行任何操作。该位置必须介于 0 和组件文本的长度之间,否则会引发异常。


Dev*_*Hnd 5

如果您想从一个实际文本行转到另一个文本行,那么您仍然需要使用 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; }
}
Run Code Online (Sandbox Code Playgroud)

如何使用上述方法(假设来自JButton 的ActionPerformed事件):

int index = getLineStartIndex(jTextArea1, 3);
if (index != -1) { 
    jTextArea1.setCaretPosition(index);
}
jTextArea1.requestFocus();
Run Code Online (Sandbox Code Playgroud)

上面的示例使用代码会将插入符号(从文档中的任何位置)移动到同一文档中第 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; }
}
Run Code Online (Sandbox Code Playgroud)

使用此方法的方式与上面所示的getLineStartIndex()方法相同。