我遇到了一个问题:首先我从文件中加载了一些大文本。之后,我想在我的JTextPane中显示它。为了将文本插入JTextPane,我使用:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textPane.setText(someLargeString);
}
});
但是,当我的文本插入JTextPane时,所有的UI都被冻结了。
有没有能力在JTextPane中插入大字符串,但不冻结UI?
感谢
p.S。加载数据的进程在另一个线程中。但在加载数据之后,我需要将其放入JTextPane中。所以我调用swing中的设置文本。但是我的UI冻结了。为什么?
您不应该在Swing EDT上调用setText
;setText
是线程安全的,请参阅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踪迹。
您可以将数据加载到另一个线程中。