有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

循环中的swing Java StyledDocument insertString()

我目前正在使用JSwing编写一个非常简单的程序。在一个JScrollPane ("textPane")里面有一个JTextArea ("textArea")。我用一个名为docTextArea编辑了这个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

请帮帮我。我对这些概念真的很陌生。提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    I managed to edit texts and stuff in this TextArea with a StyledDocument named "doc".

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

    阅读Swing教程中关于Text Component Features的部分,了解更多信息和示例

    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作为循环代码。然后,工作人员会定期“发布”结果

    阅读Swing教程中关于Concurrency in Swing的部分,了解有关EDTSwingWorker的更多信息