优化 JTextArea 文本绘制

Optimizing JTextArea Text Drawing

所以,我正在尝试制作一个小程序,以自定义方式显示来自某个应用程序的聊天记录。我已经构建了我的 GUI,并且可以从 .txt 文件中读取消息。我的问题是,当我在控制台上打印它们时,程序需要大约 1.5 秒来处理 17k 行文件。但是,当我尝试在 GUI 上显示文本时,大约需要一分半钟,我不知道为什么。

为了从文件中读取文本,我使用了 BufferedReader。为了在 JTextArea 上显示文本,我所做的就是以下操作:

JTextArea.append(myString+"\n");

如果有帮助的话,我的测试文件大约有 1,000,000 个字符。我真的很想知道发生了什么,也许还有一些关于如何解决它的建议。提前致谢。

使用 StringBuilder 构建字符串,然后在 TextArea 中调用一次 setText(),这样您就不必为每一行强制重绘该区域。

public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(() -> {
        JFrame frame =new JFrame();
        JTextArea area = new JTextArea();
        JScrollPane pane = new JScrollPane(area);

        frame.add(pane);
        frame.setPreferredSize(new Dimension(400,400));
        frame.pack();
        frame.setVisible(true);
        long t1 = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++) {
            area.append(i+"\n");
        }
        long t2 = System.currentTimeMillis();
        System.out.println("(t2-t1) = " + (t2-t1));
        StringBuilder sb = new StringBuilder(); 
        long t3 = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++) {
            sb.append(i+"\n");
        }
        long t4 = System.currentTimeMillis();
        area.setText(sb.toString());
        System.out.println("(t4-t3) = " + (t4-t3));

    });
}

打印:

(t2-t1) = 2871
(t4-t3) = 26

第一个时间差是用 JTextArea.append() 测量的,第二个是用 StringBuilder.append() 测量的,然后是 JTextArea.setText()。