Поиск тысяч файлов через поток и "обход дерева", запись совпадений в JTable приводит к безответственности
Я изменил свою программу поиска Windows 7, чтобы записать соответствующие файлы в JTable
, До этого я писал JTextArea
, Выход был уродливым; следовательно JTable
выход. Но с JTable
программа время от времени перестает отвечать на запросы при поиске тысяч файлов. (Не так с JTextArea
, Очень гладкий.)
У меня вопрос как улучшить отзывчивость.
у меня есть такой Thread
который вызывается в main
и "проходит по дереву файлов" из данного узла:
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
gui = new GUI();
Utilities.disable(GUI.btnStop);
}});
t = new Thread(new TASK());
taskStarted = false;
}
}
Вот заголовок класса для TASK
:
public class TASK extends SimpleFileVisitor<Path> implements Runnable{
Вот run
:
public void run()
{
SearchyGUI.disposition = FileVisitResult.CONTINUE;
Files.walkFileTree(path , this);
}
Вот основная процедура обхода дерева (есть еще 3, одна для обработки каталогов, одна для последующей обработки и одна для ошибок):
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
if(a.isSymbolicLink())
return SearchyGUI.disposition;
File file = new File(f.getParent().toString(), f.getFileName().toString());
try
{
if(f.getFileName().toString().toLowerCase().matches(fPatt.toLowerCase().trim())
report(s);
} catch (MalformedURLException | SAXException | TikaException ex) {msgbox(ex.toString());}
return SearchyGUI.disposition;
}
Соответствующие файлы и их информация записываются в JTable
:
private static void report(...){
ArrayList<String> rowData = new ArrayList<>(4);
rowData.add(date);
rowData.add(size);
rowData.add(filename);
rowData.add(path);
dftTableModel.addRow(new Object[]{rowData.get(0),rowData.get(1),rowData.get(2),rowData.get(3)});
}
catch (Exception e)
{
SearchyGUI.disposition = FileVisitResult.TERMINATE;
}
}
Чтобы улучшить отзывчивость, я не знаю, нужен ли мне другой Thread
для записи в JTable
или если мне нужно использовать SwingWorker
, В любом случае, я не уверен, как идти о реализации.
Предполагая другой Thread
я бы включил report
метод в класс, который implements Runnable
? У меня проблемы с визуализацией реализации, но я, вероятно, смогу понять это, если придется.
Я когда-то использовал SwingWorker
, вероятно, неправильно (без Thread
), с этой программой. Я отказался от этого, когда область вывода непрерывно вспыхнула. Так что я не заинтересован в том, чтобы идти по этому пути, но я это выясню, если это будет целесообразно.
Я не думаю, что вопрос относится к области "мнения". Нужен совет как улучшить отзывчивость. Я просто не хочу идти по неверному пути, если кто-то может заранее указать на ошибку.