如何检索和设置检索到的巨大的字符串数据——swing中的JTextArea



我有2类a和b .我正在构建一个GUI用于检索文件列表。类B用于递归,并返回一个通用的文件列表。类A用于GUI,检索文件列表并将每个文件转换为字符串。

现在,我的问题是,当我打电话System.out.println (SomeFileName.toString ());在b类中,输出速度非常快!但是当我通过类A检索相同的文件列表并将输出附加到JTextArea——那么处理速度就会变慢一百万倍。

谁能给我一个解决办法?我应该使用缓冲区吗?或者我正在查看,有人建议我使用JTextArea的文档!我正在使用NetBeans。

A类的编码如下:

     List<File> hoohoo = cr.catalog(partition);
        Iterator<File> it = hoohoo.iterator();
        while (it.hasNext()) {
            File myf = it.next();
            filesText.append(myf.toString() + NEWLINE);
        }

B类看起来像这样::

    public List<File> catalog(String file) {
    List<File> fileList = new LinkedList<File>();
    File myfile = new File(file);
    File[] fileNme = myfile.listFiles();
    for (File name : fileNme) {
        if (name.isDirectory()) {
            fileList.add(name);
            List<File> fist = sub_Catalogue(name);
            Iterator<File> it = fist.iterator();
            while (it.hasNext()) {
                fileList.add(it.next());
            }
        } else if (name.isFile()) {
            fileList.add(name);
        }
    }
    return fileList;
}
private List<File> sub_Catalogue(File name) {
    List<File> fileList2 = new LinkedList<File>();
    File[] names = name.listFiles();
    Humpty:
    if (names == null) {
        break Humpty;
    } else {
        HooHaa:
        for (File n : names) {
            if (n.isFile()) {
                fileList2.add(n);
            } else if (n.isDirectory()) {
                fileList2.add(n);
                List<File> fileList3 = sub_Catalogue(n);
                Iterator<File> uf = fileList3.iterator();
                while (uf.hasNext()) {
                    fileList2.add(uf.next());
                }
            }
        }
    }
    return fileList2;
}

问题很可能是JTextArea在每个setText/append调用上做了大量的工作。调用那个方法一百万次会让内部字符串一次增长一点,做一些工作。在列表的大小上,你可能会得到一个O(N^2)的复杂度。

尝试以下操作:使用StringBuilder,将列表中的所有字符串组合成一个字符串。然后使用这个大字符串在JTextArea上调用setText。

构建字符串的更有效的方法是使用StringBuilder:

 List<File> hoohoo = cr.catalog(partition);
 Iterator<File> it = hoohoo.iterator();
 StringBuilder filesSB = new StringBuilder();
 while (it.hasNext()) {
     File myf = it.next();
     filesSB.append(myf.toString());
     filesSB.append("n");
 }
 filesText.setText(filesSB.toString());

这是一篇关于在Swing中高效加载文本的文章:
http://users.cs.cf.ac.uk/o.f.rana/jdc/swing nov7 - 01. - txt

最新更新