Как получить и установить огромные данные String, полученные в JTextArea в разгаре?

У меня есть 2 класса -A и B. Я создаю графический интерфейс для получения списка файлов. Класс 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;
}

person udit k    schedule 18.07.2011    source источник
comment
в моей системе много разделов, и данные, возвращаемые для всех из них, выполняются быстро. За исключением моего диска C:\, на котором установлена ​​Windows 7 и различные другие программы.   -  person udit k    schedule 18.07.2011
comment
и должен ли я добавить любого слушателя в JTextArea, о котором идет речь? Изменит ли это что-нибудь? я могу опубликовать код, если нужно здесь ..   -  person udit k    schedule 18.07.2011
comment
Пожалуйста, напишите какой-нибудь код, мы не можем волшебным образом понять, что не так   -  person Suraj Chandran    schedule 18.07.2011
comment
В качестве повторения остальных, SSCCE был бы действительно полезен.   -  person Charles Goodwin    schedule 18.07.2011
comment
@Charles Goodwin: только что опубликовал код, где я думаю, что это огромная проблема. и добавить: у меня нет никаких прослушивателей для JTextArea: filesText.   -  person udit k    schedule 19.07.2011
comment
Не обращайте внимания на то, что я использую неортодоксальные имена.. ! я изменю их во время окончательного обзора.   -  person udit k    schedule 19.07.2011
comment
@udit k: Хотя это и не прямой ответ на ваш вопрос, но, учитывая, что вы перечисляете файлы, вы можете выбрать другой подход и лениво создать список файлов. Пример кода см. в графическом интерфейсе файлового браузера. Что касается имен классов, обратите внимание на людей, которые, по вашему мнению, будут читать код, и опубликуйте осмысленные имена переменных ради них.   -  person Andrew Thompson    schedule 19.07.2011
comment
@Andrew Эндрю: недавно я лениво читал о создании JTree .. спасибо .. Кажется, это то же самое ..   -  person udit k    schedule 21.07.2011
comment
@Эндрю: Плохо. Мне очень жаль. Не буду размещать здесь код без значимых имен.   -  person udit k    schedule 21.07.2011
comment
Не буду размещать здесь код без осмысленных имен. На это я и надеялся. Спасибо. :-)   -  person Andrew Thompson    schedule 21.07.2011


Ответы (2)


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

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

person jackrabbit    schedule 18.07.2011
comment
да, я тоже читал об этом и о классе StringBuffer .. огромное спасибо. ! - person udit k; 19.07.2011
comment
я хочу, чтобы извлеченные строки отображались в каждой последовательной строке, приведенное выше решение для их объединения не решит эту проблему. :( но я попробую использовать StringBuilder. - person udit k; 19.07.2011
comment
@udit: вы можете `добавлять ('\n')' по мере необходимости. - person trashgod; 19.07.2011
comment
@udit: если это неясно, то trashgod имел в виду StringBuilder.append, а не JTextArea.append. - person jackrabbit; 20.07.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());

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

person Charles Goodwin    schedule 18.07.2011
comment
дело здесь в том, что извлечение огромного списка и последующее выполнение вычислений для каждой возвращенной строки. Не будет ли это облагать налогом TextPane еще больше ?? но давайте сначала попробуем .. прокомментирую, когда попробую. Спасибо - person udit k; 19.07.2011
comment
Я думаю, дело в том, что вы можете добавлять его по частям, а не все сразу, не так ли? - person Charles Goodwin; 19.07.2011
comment
doc.insertString(); я использовал это .. тоже использовал документ .. но без текстовой панели .. и не влияет на результат .. мой диск C: \ с огромным количеством файлов все еще занимает огромное количество времени .. чтобы показать вверх ! - person udit k; 19.07.2011
comment
Хорошо, теперь я установил документ в JTextArea, время получения результата сократилось вдвое! Здорово ! Потрясающий ! спасибо за идею .. Но мой вопрос все еще остается без ответа .... :( я отредактирую и опубликую, что я сделал со своим классом .. - person udit k; 19.07.2011
comment
-1, JTextArea намного эффективнее, чем использование JTextPane. JTextPane должен поддерживать несколько шрифтов, цветов, стилей и т. д., что увеличивает накладные расходы. Используйте JTextArea для простого текста. - person camickr; 19.07.2011
comment
@camickr: точка принята, ответ сокращается только до StringBuilder - person Charles Goodwin; 19.07.2011