JTextPane插入大文本问题

发布于 2024-11-17 19:19:19 字数 397 浏览 1 评论 0原文

我有一个问题:首先我从文件加载一些大文本。之后我想将其显示在我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

我不会写诗 2024-11-24 19:19:19

您不应该在 Swing EDT 上调用 setText
setText 是线程安全的,请参阅 APIsetText 与底层 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 underlying AbstractDocument than with Swing. setText obtains a lock on the document before modifying it.

However getText must be called from the Swing EDT.

葬シ愛 2024-11-24 19:19:19

也许一些提示也有帮助
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.

记忆里有你的影子 2024-11-24 19:19:19

我的字符串大小接近 300 KB

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

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

The size of my String is nearly 300 Kbytes

If JTextArea is an acceptable alternative, it can accept > 300 KiB in ~1 second.

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);
    }
}
凉世弥音 2024-11-24 19:19:19

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

You can try using the SwingWorker.
Here is the Java trail for it.

假情假意假温柔 2024-11-24 19:19:19

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

you could put the data load into another thread.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文