JTextArea setText(veryLongString)花费了太多时间 [英] JTextArea setText(veryLongString) is taking too much time
问题描述
我有一个非常长的字符串,我从书中得到。我使用setText()方法在JTextArea中显示它。它会冻结用户界面并花费大量时间。我如何解决这个问题?
I have a very long string which I get from a book. I display it in a JTextArea by using the setText() method. It freezes the UI and takes a lot of time. How do I get around that?
这是作为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();
}
});
}
}
推荐答案
创建 DefaultStyledDocument 构建GUI的单独线程似乎是创建巨大文本区域的最快方法。 DefaultStyledDocument是线程安全的。
Creating a DefaultStyledDocument in a separate thread from constructing the GUI seems to be the fastest way to create a huge text area. A DefaultStyledDocument is thread safe.
这是我用来测试DefaultStyledDocument的代码。我创建了带空格的文本,以便换行的Swing代码有机会工作。
Here's the code I used to test the DefaultStyledDocument. I created text with spaces so that the Swing code to line wrap had a chance to work.
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());
}
}
这篇关于JTextArea setText(veryLongString)花费了太多时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!