如何在TextArea中重新定位光标

时间:2017-09-02 06:01:02

标签: java swing jtextcomponent

我在clickCount++中设置了一些文字。光标位于第5行。现在我想在第一行设置一些文字。

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

2 个答案:

答案 0 :(得分:3)

如果你想从一个实际的文本行转到另一个文本行,那么你仍然需要使用 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; }
}

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

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()方法相同。

答案 1 :(得分:2)

使用JTextComponent.setCaretPosition(int)

  

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