Как получить и установить огромные данные String для JTextArea в разгаре? - PullRequest
0 голосов
/ 18 июля 2011

У меня есть 2 класса -A и BI строю графический интерфейс для получения списка файлов.Класс B предназначен для рекурсии и возвращает общий список файлов.Класс A предназначен для графического интерфейса и извлекает список файлов и преобразует каждый файл в строку.

Теперь моя проблема заключается в том, что при вызове 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;
}

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Проблема, вероятно, заключается в том, что JTextArea выполняет большую работу над каждым вызовом setText / append. Вызов этого метода в миллион раз немного увеличит внутреннюю строку и сделает некоторую работу. Вы, вероятно, в конечном итоге с O (N ^ 2) -подобной сложностью по размеру списка.

Попробуйте следующее: используя StringBuilder, объедините все строки в списке, чтобы сформировать только одну строку. Затем вызовите setText для JTextArea, используя эту единственную большую строку.

0 голосов
/ 18 июля 2011

Более эффективный способ построить строку, которую вы будете помещать в виде текста в JTextArea, - это использовать 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());

Вот статья об эффективной загрузке текста вКачели:
http://users.cs.cf.ac.uk/O.F.Rana/jdc/swing-nov7-01.txt

...