JTextPane вставка большой текстовой проблемы - PullRequest
3 голосов
/ 30 июня 2011

У меня проблема: сначала я загружаю большой текст из файла.После этого я хочу отобразить его в моем JTextPane.Для вставки текста в JTextPane я использую:

 SwingUtilities.invokeLater(new Runnable()
 {

 public void run()
 {
   textPane.setText(someLargeString);
  } 
});

Но пока мой текст вставляется в JTextPane, весь пользовательский интерфейс заморожен.

Есть ли возможность вставить большую строку в JTextPane, но без ее зависания?

Спасибо

PS Процесс загрузки данных в другом потоке.Но после загрузки данных мне нужно поместить их в JTextPane.Так что я вызываю текст установки в разгаре.Но мой пользовательский интерфейс зависает.Почему?

Ответы [ 5 ]

4 голосов
/ 30 июня 2011

Вы не должны звонить setText на Swing EDT;setText является поточно-ориентированным, см. API .setText имеет больше общего с базовым AbstractDocument, чем с Swing.setText получает блокировку документа перед его изменением.

Однако getText должен вызываться из Swing EDT.

3 голосов
/ 30 июня 2011

Может быть, некоторые из советов также могут помочь http://java -sl.com / JEditorPanePerformance.html

Ответ trashgod является правильным, если вам нужен просто текст.Если у вас есть текст со стилями, вам нужен JEditorPane / JTextPane.

2 голосов
/ 30 июня 2011

Размер моей строки составляет почти 300 Кбайт

Если JTextArea является приемлемой альтернативой, он может принять> 300 КиБ за ~ 1 секунду.

import javax.swing.*;
import java.awt.*;

/** @see http://stackoverflow.com/questions/6536178 */
public class JTextAreaPasteTest {

    public static void main(String argv[]) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                display();
            }
        });
    }

    private static void display() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        String testStr = "Paste text here.";
        JTextArea wrapArea = new JTextArea(testStr, 20, 40);
        wrapArea.setLineWrap(true);
        wrapArea.setWrapStyleWord(true);
        wrapArea.setCaretPosition(testStr.length());
        frame.add(new JScrollPane(wrapArea));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
2 голосов
/ 30 июня 2011

Вы можете попробовать использовать SwingWorker . Вот для этого Java-тропа .

0 голосов
/ 30 июня 2011

вы можете поместить загрузку данных в другой поток.

...