尝试在搜索程序中使用SwingWorker在线程中使用FileVisitor

时间:2015-08-17 16:57:58

标签: java multithreading swing swingworker filevisitor

这会继续this thread of August 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命令非法(错误:runfinalSwingWorker)。

这是原始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(); GUI显示,但是当我点击搜索按钮时,没有任何反应。没有文件走路。没有错误。 TASK的输出甚至没有显示。所以没有机会调用SwingWorker。 (事实上​​,只是为了查看可能会发生的事情[无]我将其从TASK的类标题中删除了:public class TASK /*extends SwingWorker*/ implements FileVisitor<Path>。)

如果有任何明显的错误,我很乐意看到它。如果没有,我将花费很长时间制作SSCCE

1 个答案:

答案 0 :(得分:0)

感谢@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));
    }
  }


}

唯一困扰我的是我没有实施publishprocess以及其他SwingWorker方法。

修改

所以我在上面的代码中包含了两个。

编辑2

我根据TASK的类定义更改了几个语句的类型:

public class TASK extends SwingWorker<Void,String>

SwingWorker的第一个通用类型参数(上面是Void)必须是doInBackground(和get返回的类型,如果使用的话)。

第二个String,必须是publishprocess中使用的类型。