如何到达TextArea的末尾

5

可能是重复问题:
如何在Java GUI中设置JTextArea的自动滚动?

我正在创建一个应用程序,用户在TextField中输入文本,当actionPerformed时将文本添加到TextArea中。
TextArea添加在JScrollPane上。 当行数超出声明的列数时,用户可以滚动以查看文本。 但是,每次通过TextField输入一些文本到TextArea时,他需要手动滚动,因为最后一行添加到TextArea时不会自动滚动到最后一行。
有人能帮我解决这个问题吗? 如何使TextAreaactionPerformed时自动滚动到底部?


一个快速的解决方法是 jTextArea.selectAll(); - Harry Joy
2个回答

5

这个魔法存在于DefaultCaret.updatePolicy中:

DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

详细信息请参见Rob的博客文章


3

试试这个:

jTextArea.selectAll();
int last = jTextArea.getSelectionEnd();
jTextArea.select(last, last);

其中jTextArea是您的文本区域的引用。

然而,如果有很多文本,前面的示例可能会非常慢,所以我提供了另一种方法来解决这个问题:

jTextArea.setCaretPosition(jTextArea.getDocument().getLength());

编辑:在互联网上搜索替代方案并阅读这个类似问题的答案后,我意识到@kleopatra的解决方案更加有效。不过,你完全有权选择你认为合适的答案(我看到你已经接受了我的答案)。

@kleopatra,我为你点赞以示补偿。:)


为什么不直接使用 jTextArea.setCaretPosition(jTextArea.getText().length()); 呢? - DRCB
@DRCB,你不应该使用getText().length()。这会导致从文档中重新构建文本字符串的不必要工作。相反,你可以使用getDocument().getLength(),它实现了相同的功能但更加高效。 - camickr
@camickr 哇,你教给了我新知识。:) 我会修改我的答案。顺便提一下,在类似问题上我引用了你的答案。 - fireshadow52

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接