Попытка использовать SwingWorker в программе поиска, которая использует FileVisitor в потоке

Так продолжается эта ветка от 16 августа 2015 г.

Я модифицирую свой Search программа для использования SwingWorker, Оригинальный код (main показано ниже) имеет один 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{

Но для того, чтобы использовать SwingWorker, (Я предполагаю) мне нужно TASK extends SwingWorker, делая оригинал run команда недопустима (ошибка: run является final в SwingWorker).

Вот оригинал run:

  public void run() 
  {
      SearchyGUI.disposition = FileVisitResult.CONTINUE;
      Files.walkFileTree(path , this);
  }

Так как я не могу использовать runЯ сделал код выше инициализации для класса TASK вот так:

public class TASK implements SwingWorker implements FileVisitor<Path> {
  public void TASK() 
  {
      System.out.println("Here we are starting TASK...");
      SearchyGUI.disposition = FileVisitResult.CONTINUE;
      Files.walkFileTree(path , this);
  }

Но теперь линия в main ниже приводит к ошибке (нет подходящего конструктора, так как теперь TASK не реализует runnable....):

 t = new Thread(new TASK());

И если я просто скажу new TASK(); графический интерфейс показывает, но когда я нажимаю кнопку поиска, ничего не происходит. Нет файловой прогулки. Нет ошибок Выход из TASK даже не показывает. Так что нет шансов призвать SwingWorker, (На самом деле, просто чтобы посмотреть, что может случиться [ничего], я удалил его из заголовка класса для TASK: public class TASK /*extends SwingWorker*/ implements FileVisitor<Path>.)

Если что-то очевидное не так, я хотел бы увидеть это. Если нет, я проведу много времени, пока SSCCE,

1 ответ

Благодаря @Hover у меня есть достаточно слаженная программа поиска. Основные моменты (т.е. нет подробностей о переменных или логике):

public class Main  
{
  public static void main(String args[]) 
  {
    EventQueue.invokeLater
    (
      new Runnable() 
      {
        @Override
        public void run() 
        {
          gui = new GUI();
        }
      }
    );
  }
}

//==============================================================

public class GUI extends JFrame
{
  private static void btnSearchActionPerformed(ActionEvent evt) 
  {
      TASK task = new TASK();
      task.execute();      
  }
}

//==============================================================

public class TASK extends SwingWorker<Void,String>
{
  FV fv;

  TASK()
  {
    fv = new FV();
  }

  //-------------- inner class   

    class FV implements FileVisitor<Path>
    {
      public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException 
      {
        if(f.getFileName().toString().toLowerCase().matches(fPatt.toLowerCase().trim()))
        {
             publish(s); // old --> report(f); -- see process method below
        }
        return Main.disposition;
      }
    }

  //----------------

  protected Void doInBackground() throws Exception 
  {
    Files.walkFileTree(path, fv);
    return null;
  }

// **EDIT** added new method

  @Override
  protected void process(List<String> chunks){
    for (int i = 0; i < chunks.size(); i++) {
      report(chunks.get(i));
    }
  }


}

Меня беспокоит только то, что я не publish а также process и другие SwingWorker методы.

РЕДАКТИРОВАТЬ

Таким образом, я включил два в коде выше.

РЕДАКТИРОВАТЬ 2

Я изменил типы для нескольких операторов, основываясь на определении класса для TASK:

public class TASK extends SwingWorker<Void,String>

Первый параметр универсального типа для SwingWorker, который Void выше, должен быть тип, возвращаемый doInBackground (а также get, если используется).

Второй, String выше, должен быть тип, используемый в publish а также process,

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