Java StyledDocument insertString () в цикле - PullRequest
0 голосов
/ 25 апреля 2020

В настоящее время я пишу действительно простую программу с использованием JSwing. Внутри JScrollPane ("textPane") есть JTextArea ("textArea"). Мне удалось отредактировать текст и прочее в этом TextArea с StyledDocument с именем do c. Однако, когда я хочу вставить строку в этот документ через некоторое время l oop, все тексты появляются сразу после окончания l oop. Эффект, который я хочу, состоит в том, чтобы тексты появлялись один за другим и построчно с помощью 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 голос
/ 25 апреля 2020

Мне удалось отредактировать текст и прочее в этой TextArea с помощью StyledDocument с именем "do c".

JTextArea не поддерживает StyledDocument. Вам нужно будет использовать JTextPane, если вы хотите стиль текста.

Прочтите раздел из учебника Swing по Возможности текстовых компонентов для получения дополнительной информации и примеров.

Однако, когда я хочу вставить строку в этот документ через некоторое время l oop все тексты появляются сразу после окончания l oop.

Правильно. Ваш код выполняется в потоке рассылки событий (EDT). GUI не может перерисоваться, пока не завершится выполнение l oop.

Поэтому, чтобы предотвратить блокировку EDT, вам необходимо выполнить свой код в отдельном потоке. В этом случае вы можете использовать SwingWorker для вашего кода зацикливания. Затем работник будет "публиковать sh" результаты с регулярным интервалом.

Прочитайте раздел из учебника Swing по Параллельность в Swing для получения дополнительной информации о EDT и SwingWorker.

...