0

这延续了 2015 年 8 月 16 日的主题

我正在修改我的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 没有实现可运行的......):

 t = new Thread(new TASK());

如果我只是说new TASK();GUI 显示,但是当我单击“搜索”按钮时,什么也没有发生。没有文件步行。没有错误。的输出TASK甚至没有显示。所以没有机会调用SwingWorker. (事实上​​,只是为了看看会发生什么[什么],我把它从类头中删除了TASK: public class TASK /*extends SwingWorker*/ implements FileVisitor<Path>。)

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

4

1 回答 1

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));
    }
  }


}

唯一困扰我的是我还没有实现publishandprocess和其他SwingWorker方法。

编辑

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

编辑 2

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

public class TASK extends SwingWorker<Void,String>

上面的第一个泛型类型参数必须是(和,如果使用)返回SwingWorker的类型。VoiddoInBackgroundget

上面的第二个String必须是publishand中使用的类型process

于 2015-08-17T18:40:02.247 回答