优化 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()。
所以,我正在尝试制作一个小程序,以自定义方式显示来自某个应用程序的聊天记录。我已经构建了我的 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()。