错误的部分原因是您正在从事件线程外部访问Swing组件!是的,setText()是线程安全的,但是Swing方法不是线程安全的,除非明确声明它们是这样的。因此,setCaretPosition()不是线程安全的,必须从事件线程进行访问。这几乎可以肯定是您的应用程序最终冻结的原因。
注:
JTextPane继承其
setText()从方法
JEditorPane和
setCaretPosition从方法
JTextComponent,这也解释了在上一节中的链接不会去
JTextPane的JavaDoc页面。
为了确保线程安全,您实际上至少需要
setCaretPosition()从事件线程中进行调用,您可以使用以下代码执行此操作:
SwingUtilities.invokeAndWait(new Runnable() { public void run() { a.setText(b.toString()); a.setCaretPosition(b.length()); }}并且由于您必须
setCaretPosition()从事件线程中进行调用,因此您最好也
setText()从同一位置进行调用。
您可能不需要手动设置插入标记的位置。查阅JavaDoc for
JTextComponent中的“
Caret Changes”部分。
最后,您可能需要查看一系列两篇文章:
- 更快的JTextPane文本插入(第一部分)
- 更快的JTextPane文本插入(第二部分)



