首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线程中使用FileVisitor的搜索程序中尝试使用SwingWorker

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

Stack Overflow用户
提问于 2015-08-18 00:57:58
回答 1查看 116关注 0票数 0

这将继续this thread of August 16, 2015

我正在修改我的Search程序以使用SwingWorker。原始代码(如下所示的main)有一个在main中调用的Thread,并从给定节点“遍历文件树”:

代码语言:javascript
复制
  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的原始类头

代码语言:javascript
复制
public class TASK extends SimpleFileVisitor<Path> implements Runnable{

但是为了使用SwingWorker,(我假设)我需要TASK extends SwingWorker,这使得最初的run命令是非法的(错误:runSwingWorker中是final )。

这是原始的run

代码语言:javascript
复制
  public void run() 
  {
      SearchyGUI.disposition = FileVisitResult.CONTINUE;
      Files.walkFileTree(path , this);
  }

因为我不能使用run,所以我在TASK类的初始化上面编写了如下代码:

代码语言:javascript
复制
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中的代码行导致了错误(没有合适的构造函数,因为现在的任务没有实现Runnable...):

代码语言:javascript
复制
 t = new Thread(new TASK());

如果我只说new TASK();,图形用户界面就会显示出来,但当我单击搜索按钮时,什么也没有发生。没有文件遍历。没有错误。TASK的输出甚至没有显示出来。所以没有机会调用SwingWorker。(实际上,为了看看会发生什么,我从TASKpublic class TASK /*extends SwingWorker*/ implements FileVisitor<Path>的类头中删除了它。)

如果有什么明显的错误,我很乐意看到它。如果没有,我会花很长时间制作一个SSCCE

EN

回答 1

Stack Overflow用户

发布于 2015-08-18 02:40:02

多亏了@Hover,我有了一个相当流畅的搜索程序。突出显示(即没有关于变量或逻辑的详细信息):

代码语言:javascript
复制
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中使用的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32055869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档