循环中的Java StyledDocument insertString()。

问题描述 投票:0回答:1

我目前正在使用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 显示了 "来自事件调度器线程"。

请帮我解决这个问题。我对这些概念真的很陌生。先谢谢你。

java swing jtextarea styleddocument
1个回答
1
投票

我设法用一个名为 "doc "的StyledDocument来编辑这个TextArea中的文本和其他东西。

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

请阅读Swing教程中关于 文本组件功能 获取更多信息和示例。

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

你的代码是在事件派遣线程(EDT)上执行的。在循环执行结束之前,GUI不能重新画出自己。

所以为了防止EDT阻塞,你需要在一个单独的线程上执行你的代码。在这种情况下,您可以使用 SwingWorker 的循环代码。然后,该工作者将定期 "发布 "结果。

请阅读Swing教程中关于 摇摆中的并发性 更多关于 EDTSwingWorker.

© www.soinside.com 2019 - 2024. All rights reserved.