Java 循环中的 StyledDocument insertString()
Java StyledDocument insertString() in a loop
我目前正在使用 JSwing 编写一个非常简单的程序。 JScrollPane ("textPane")
里面有一个JTextArea ("textArea")
。我设法用名为 doc 的 StyledDocument
编辑了此 TextArea
中的文本和内容。但是,当我想在 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()
的方法解决,但是当我这样做的时候,却显示了错误信息"Cannot call invokeAndWait
from the event dispatcher thread"。
请帮我解决这个问题。我对这些概念真的很陌生。提前致谢。
I managed to edit texts and stuff in this TextArea with a StyledDocument named "doc".
JTextArea 不支持 StyledDocument。如果您想要样式化的文本,则需要使用 JTextPane。
阅读有关 Text Component Features 的 Swing 教程部分,了解更多信息和示例。
However, when I want to insert a string into this document in a while loop, all texts appear at once after the loop ends.
正确。您的代码正在事件调度线程 (EDT) 上执行。在循环执行完毕之前,GUI 无法重新绘制自身。
因此,为了防止 EDT 阻塞,您需要在单独的线程上执行您的代码。在这种情况下,您可以使用 SwingWorker
作为循环代码。然后工作人员会定期 "publish" 结果。
阅读有关 Concurrency in Swing 的 Swing 教程部分,了解有关 EDT
和 SwingWorker
的更多信息。
我目前正在使用 JSwing 编写一个非常简单的程序。 JScrollPane ("textPane")
里面有一个JTextArea ("textArea")
。我设法用名为 doc 的 StyledDocument
编辑了此 TextArea
中的文本和内容。但是,当我想在 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()
的方法解决,但是当我这样做的时候,却显示了错误信息"Cannot call invokeAndWait
from the event dispatcher thread"。
请帮我解决这个问题。我对这些概念真的很陌生。提前致谢。
I managed to edit texts and stuff in this TextArea with a StyledDocument named "doc".
JTextArea 不支持 StyledDocument。如果您想要样式化的文本,则需要使用 JTextPane。
阅读有关 Text Component Features 的 Swing 教程部分,了解更多信息和示例。
However, when I want to insert a string into this document in a while loop, all texts appear at once after the loop ends.
正确。您的代码正在事件调度线程 (EDT) 上执行。在循环执行完毕之前,GUI 无法重新绘制自身。
因此,为了防止 EDT 阻塞,您需要在单独的线程上执行您的代码。在这种情况下,您可以使用 SwingWorker
作为循环代码。然后工作人员会定期 "publish" 结果。
阅读有关 Concurrency in Swing 的 Swing 教程部分,了解有关 EDT
和 SwingWorker
的更多信息。