gpt4 book ai didi

java - 使文本较多的 TextArea 及其 Frame 响应更快

转载 作者:行者123 更新时间:2023-12-01 10:25:23 25 4
gpt4 key购买 nike

如何使大约 2MB 数据的 TextArea 响应更快?
换行已启用 (true)
当我启用 doubleBufferd 时,框架响应非常慢

应显示的数据(UTF-8 中的所有字符)存储在字符串中

调整窗口大小大约需要 3 秒
与此类似:

String result = "";
int i = 0;
while (i < 1000000) {
result += i;
i++;
}
textArea.setText(result);

最佳答案

您的 200KiB 文本是什么样子的?

您没有提供minimal working example所以我为你创建了一个。

import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public final class Main extends JFrame {

private final JTextArea text;

Main() {
super("Just a Test");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.text = new JTextArea();
this.text.setLineWrap(true);
this.text.setDoubleBuffered(true);
this.add(new JScrollPane(this.text));
this.setPreferredSize(new Dimension(800, 600));
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}

void appendFile(final File file) throws IOException {
try (final BufferedReader br = new BufferedReader(new FileReader(file))) {
while (true) {
final String line = br.readLine();
if (line == null) {
break;
}
this.text.append(line + '\n');
}
}
}

public static void main(final String[] args) {
final Main self = new Main();
for (final String arg : args) {
try {
self.appendFile(new File(arg));
} catch (final IOException e) {
System.err.printf("error: Cannot load text from file '%s': %s\n",
arg, e.getMessage());
}
}
}

}

问题似乎是内部使用的自动换行算法对于极长的行变得低效。

  • 如果我加载一个行长约为 100 个字符的普通文本文件,即使我将窗口大小调整到每行都必须多次换行的程度,调整窗口大小几乎会立即发生.

  • 但是,当我加载所有文本都在一行上的相同大小的文本文件时,调整大小所需的时间明显更长。

  • 最后,当我将所有文本放在一行上并且该行不以\n结尾时,调整大小变得非常慢。 (虽然仍然不是您报告的三秒,但话又说回来,我在一台速度相当快的计算机上尝试过这一点。)这几乎看起来像是 Swing 代码中的一个错误,因为缺少终止 \n 不应使算法变慢。

所以我的第一个建议是您重新访问您的文本源。一个单行包含 200KiB 文本的文件看起来很奇怪,如果你的 GUI 变得有点慢,我认为这也不算太糟糕。 (只要程序仍然正常运行。)如果文本是由您自己的程序生成的,请务必在有意义的地方插入换行符。如果文本在适当的位置有换行符,人们可以更轻松地阅读文本。许多其他应用程序也会在处理这么长的队列时遇到麻烦,所以每个人都赢了。

如果您认为自己遇到了尾随 \n 问题,请尝试在 JTextArea 中的文本中附加一个额外的 \n位于正文末尾。

作为最后的手段,您可以考虑禁用换行并添加水平滚动条。但我注意到,在这种情况下,JTextArea 对极长的行也不太满意。

关于java - 使文本较多的 TextArea 及其 Frame 响应更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com