JTextPane插入大文本问题
我有一个问题:首先我从文件加载一些大文本。之后我想将其显示在我的 JTextPane 中。为了将文本插入 JTextPane,我使用:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textPane.setText(someLargeString);
}
});
但是当我的文本插入 JTextPane 时,所有 UI 都被冻结。
是否有能力将大字符串插入 JTextPane 但不会冻结 UI?
谢谢
加载数据的过程在另一个线程中。但是加载数据后我需要将其放入 JTextPane 中。所以我在 swing 中调用设置文本。但我的用户界面冻结了。为什么?
I've a problem: firstly I load some large text from file. After that I want to display it in my JTextPane. For inserting text into JTextPane I use:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textPane.setText(someLargeString);
}
});
But while my text inserts into JTextPane all UI is frozen.
Is there any ability to insert large String into JTextPane but without UI freezing?
Thanks
P.S.
Process of loading data is in another thread. But after data is loaded I need to put it into JTextPane. So I'm invoking setting text in swing. But my UI freeze. Why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您不应该在 Swing EDT 上调用
setText
;setText
是线程安全的,请参阅 API。setText
与底层AbstractDocument
的关系比与 Swing 的关系更大。setText
在修改文档之前获取文档的锁定。但是,必须从 Swing EDT 调用
getText
。You should not call
setText
on the Swing EDT;setText
is thread-safe, see the API.setText
has more to do with the underlyingAbstractDocument
than with Swing.setText
obtains a lock on the document before modifying it.However
getText
must be called from the Swing EDT.也许一些提示也有帮助
http://java-sl.com/JEditorPanePerformance.html
如果您只需要,trashgod 的答案是正确的纯文本。如果您有带样式的文本,则需要 JEditorPane/JTextPane。
May be some of the tips could help as well
http://java-sl.com/JEditorPanePerformance.html
trashgod's answer is correct if you need just plain text. If you have text with styles you need the JEditorPane/JTextPane.
如果
JTextArea
是可接受的替代方案,它可以接受 >约 1 秒内 300 KiB。If
JTextArea
is an acceptable alternative, it can accept > 300 KiB in ~1 second.您可以尝试使用 SwingWorker。
这是它的 Java 跟踪。
You can try using the SwingWorker.
Here is the Java trail for it.
您可以将数据加载到另一个线程中。
you could put the data load into another thread.