JTextPane插入大文本的问题



我遇到了一个问题:首先我从文件中加载了一些大文本。之后,我想在我的JTextPane中显示它。为了将文本插入JTextPane,我使用:

 SwingUtilities.invokeLater(new Runnable()
 {
 public void run()
 {
   textPane.setText(someLargeString);
  } 
});

但是,当我的文本插入JTextPane时,所有的UI都被冻结了。

有没有能力在JTextPane中插入大字符串,但不冻结UI?

感谢

p.S。加载数据的进程在另一个线程中。但在加载数据之后,我需要将其放入JTextPane中。所以我调用swing中的设置文本。但是我的UI冻结了。为什么?

您不应该在Swing EDT上调用setTextsetText是线程安全的,请参阅API。与Swing相比,setText与底层AbstractDocument的关系更大。setText在修改文档之前获得对文档的锁定。

但是,必须从Swing EDT调用getText

可能有些技巧也会有所帮助http://java-sl.com/JEditorPanePerformance.html

如果你只需要纯文本,垃圾神的答案是正确的。如果您有带样式的文本,则需要JEditorPane/JTextPane。

我的字符串大小接近300 KB

如果JTextArea是一个可接受的替代方案,它可以在约1秒内接受>300KiB。

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);
    }
}

您可以尝试使用SwingWorker。这是它的Java踪迹。

您可以将数据加载到另一个线程中。

相关内容

  • 没有找到相关文章

最新更新