0

我目前正在使用 JSwing 编写一个非常简单的程序。JTextArea ("textArea")里面有一个JScrollPane ("textPane")。我设法TextArea用一个StyledDocument命名的doc编辑了其中的文本和内容。但是,当我想在 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()and来解决这个问题textArea.repaint(),但都没有成功。我在网上搜索,有人说可以通过invokeAndWait()方法解决,但是当我这样做时,显示错误消息“无法invokeAndWait从事件调度程序线程调用”。

请帮我解决一下这个。我对这些概念真的很陌生。提前致谢。

4

1 回答 1

1

我设法使用名为“doc”的 StyledDocument 编辑此 TextArea 中的文本和内容。

JTextArea 不支持 StyledDocument。如果您想要样式化的文本,则需要使用 JTextPane。

阅读 Swing 教程中有关文本组件功能的部分以获取更多信息和示例。

但是,当我想在 while 循环中向该文档中插入一个字符串时,所有文本都会在循环结束后立即出现。

正确的。您的代码正在事件调度线程 (EDT) 上执行。在循环完成执行之前,GUI 不能重新绘制自己。

因此,为了防止 EDT 阻塞,您需要在单独的线程上执行代码。在这种情况下,您可以使用 a SwingWorkerfor 您的循环代码。然后,工作人员将定期“发布”结果。

阅读 Swing 教程中有关Swing 中的并发EDT的部分,以获取有关和的更多信息SwingWorker

于 2020-04-25T15:36:19.423 回答