我目前正在使用JSwing编写一个非常简单的程序。有一个 JTextArea ("textArea")
里面 JScrollPane ("textPane")
. 我设法编辑文本和东西在这个 TextArea
带着 StyledDocument
名为 文档. 但是,当我想在while循环中向这个文档中插入一个字符串时,循环结束后,所有的文本都会同时出现。我想看到的效果是,借助于 Thread.sleep()
.
下面是我的代码示例。
while (listening == false && a <= StoryInterface.getDiaNum()) {
doStoryMode(a, b);
Thread.sleep(100);
if (b == StoryInterface.getNumOfSentence()[a] - 1) {
b = 1;
a ++;
} else {
b ++;
}
}
哪儿 doStoryMode(a, b)
是一个简单的方法,调用 doc.insertString(...)
. 程序能用了,但是我看不到东西一个一个的出现。我试图通过写 textPane.repaint()
和 textArea.repaint()
,但都没有成功。我在网上搜索了一下,有人说可以通过以下方法解决 invokeAndWait()
方法,但当我这样做时,错误信息 "不能调用 invokeAndWait
显示了 "来自事件调度器线程"。
请帮我解决这个问题。我对这些概念真的很陌生。先谢谢你。
我设法用一个名为 "doc "的StyledDocument来编辑这个TextArea中的文本和其他东西。
一个JTextArea不支持StyledDocument。如果你想要样式化的文本,你需要使用JTextPane。
请阅读Swing教程中关于 文本组件功能 获取更多信息和示例。
但是,当我想在while循环中向这个文档中插入一个字符串时,循环结束后,所有的文本都会同时出现。
你的代码是在事件派遣线程(EDT)上执行的。在循环执行结束之前,GUI不能重新画出自己。
所以为了防止EDT阻塞,你需要在一个单独的线程上执行你的代码。在这种情况下,您可以使用 SwingWorker
的循环代码。然后,该工作者将定期 "发布 "结果。
请阅读Swing教程中关于 摇摆中的并发性 更多关于 EDT
和 SwingWorker
.