Поиск тысяч файлов через поток и "обход дерева", запись совпадений в 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), с этой программой. Я отказался от этого, когда область вывода непрерывно вспыхнула. Так что я не заинтересован в том, чтобы идти по этому пути, но я это выясню, если это будет целесообразно.

Я не думаю, что вопрос относится к области "мнения". Нужен совет как улучшить отзывчивость. Я просто не хочу идти по неверному пути, если кто-то может заранее указать на ошибку.

0 ответов

Другие вопросы по тегам