当前位置: 首页 > 面试题库 >

JTextArea setText(veryLongString)花费太多时间

贺英悟
2023-03-14
问题内容

我有一本书得很长。我使用setText()方法在JTextArea中显示它。它冻结了UI,并花费大量时间。我该如何解决?

这是SSCCE:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class SSCCE extends JFrame {

    JTextArea textArea;

    public SSCCE() {
        String text = buildLongString(400000);
        textArea = new JTextArea();
        textArea.setText(text);
        textArea.setLineWrap(true);
        add(new JScrollPane(textArea));

        setSize(400, 350);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private String buildLongString(int length) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < length; i++) {
            builder.append("x");
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SSCCE();
            }
        });
    }

}

问题答案:

在与构造GUI分开的单独线程中创建DefaultStyledDocument似乎是创建巨大文本区域的最快方法。DefaultStyledDocument是线程安全的。

这是我用来测试DefaultStyledDocument的代码。我用空格创建了文本,以便换行的Swing代码有机会工作。

package com.ggl.testing;

import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;

public class HugeTextArea implements Runnable {

    private DefaultStyledDocument   document;

    private JFrame                  frame;

    private JTextArea               textArea;

    public HugeTextArea() {
        this.document = new DefaultStyledDocument();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                buildLongString(400000);
            }
        };
        new Thread(runnable).start();
    }

    @Override
    public void run() {
        frame = new JFrame();
        frame.setTitle("Huge Text");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        textArea = new JTextArea(document);
        textArea.setLineWrap(true);
        frame.add(new JScrollPane(textArea));

        frame.setSize(400, 350);
        frame.setLocationRelativeTo(null);

        frame.setVisible(true);
    }

    private void buildLongString(int length) {
        Random random = new Random();
        String[] chars = { "s", "t", "a", "y", " " };
        for (int i = 0; i < length; i++) {
            try {
                document.insertString(document.getLength(),
                        chars[random.nextInt(chars.length)],
                        null);
            } catch (BadLocationException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new HugeTextArea());
    }

}


 类似资料:
  • 我遵循这个链接制作一个CRF模型。我使用以下命令制作模型。 模型制作成功,但我的训练数据非常多,花费了太多时间。当我仔细观察系统中发生的事情时。它只使用了我电脑的一个核心 我能否以使用计算机多个核心的方式运行此命令?看起来它是作为单个线程实现的。是否支持多线程?如果是,请分享。

  • 任何解决这一问题的建议都将不胜感激。或者我们可以用另一种方式来计数?我想补充一些细节。滑动大小是一个事件和窗口大小超过10小时(每秒大约有300个事件),我们需要对每个事件做出反应。所以在这种情况下,我们没有使用Flink提供的窗口。我们使用来存储前面的信息。在中用于触发旧数据的清理作业。最后dinstinct键的数量非常多。

  • 我收集了300万份文件,索引如下: {ts:1},{u\u id:1} 请注意,这是两个单独的升序索引,而不是复合索引。 当我运行此查询时: db.collection.find({u_id:'user'})。排序({ts:-1})。跳过(0)。限制(1) 需要100毫秒。我有以下日志: 2017-04-15T06:42:01.147 0000 I命令[conn783]查询。集合查询:{order

  • 我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存

  • 问题内容: SQL: 用户索引: 个人资料索引 解释 : 上面的查询大约需要0.1221 我怎样才能使其运行更快? 问题答案: 我删除了此查询,因此搜索完成后不会显示总结果数。 似乎是临时解决方案,甚至是永久解决方案。

  • 目前,我正在开发一个社交媒体网站,用户可以像Facebook一样发布任何内容。现在我已经开发了一个从数据库过滤帖子的高级搜索。例如,数据库中有40,000个条目,我想通过高级搜索过滤行。例如,如果我搜索网站,它会显示正确的条目,但如果我搜索图像或视频,它会重复结果。 我只有40,000行,但在结果中显示了2,51,905个条目。这是我的疑问 我在等你的回应。谢谢.