首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有SwingWorker的FileVisitor不能快速发布处理过的信息;GUI挂起

带有SwingWorker的FileVisitor不能快速发布处理过的信息;GUI挂起
EN

Stack Overflow用户
提问于 2015-08-20 16:24:01
回答 2查看 65关注 0票数 2

使用SwingWorkerFileVisitor,不会快速发布处理过的信息;GUI挂起。我更希望它没有,想要帮助解决这个问题,

下面简要介绍如何使用SwingWorkerFileVisitor接口搜索符合用户指定条件的文件。:

代码语言: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
  {
    public     GUI()
    {
      init();
      createAndShowGUI();
    }

     private void init()
     {
       dftTableModel = new DefaultTableModel(0 , 4);
         tblOutput     = new JTable(dftTableModel);
         tblOutput.setAutoResizeMode(AUTO_RESIZE_OFF);
         scrTblOutput     = new JScrollPane(tblOutput);
       dftTableModel.setColumnIdentifiers(new Object[]{"Date", "Size", "Filename", "Path"});

编辑如果我只包含这两行,问题可能会立即解决。

代码语言:javascript
复制
       tca = new tablecolumnadjuster.TableColumnAdjuster(tblOutput);
       tca.setDynamicAdjustment(true);

     }

      private static void btnSearchActionPerformed(ActionEvent evt) 
      {
        TASK task = new TASK();
        task.execute();      
      }
    }
  }
  //==============================================================

  public class TASK extends SwingWorker<Void,String>
  {

    private class rowRec{
      String date;
      int size;
      String filename;
      String pathname;

      private rowRec(String d, int s, String f, String p) 
      {
        date = d; 
        size = s; 
        filename = f; 
        pathname = p;
      }
    }

    FV fv;

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

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

      class FV implements FileVisitor<Path>
      {
        // When walk begins, internal FileVisitor code makes this routine
        // loop until no more files are found OR disposition = TERMINATE.

        public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException 
        {
          if(f.getFileName().toString().toLowerCase().matches(fPatt.toLowerCase().trim()))
          {

             publish(s); 

             if(++k > parseInt(GUI.txtMaxMatches.getText()))

                disposition = TERMINATE;
                publish("Stopped at max. records specified");
          }
          return disposition;
        }
      }
    //----------------

    private  void report(String s)
    {
      rowData = new rowRec(date, isize, filename, path);
      dftTableModel.addRow(new Object[]{rowData.date, rowData.size, rowData.filename, rowData.pathname});
    }

    @Override
    protected void process(List<String> chunks)
    {
      chunks.stream().
        forEach
        (
           (chunk) -> 
           {
             report(chunk);
           }
      );
      kc += chunks.size();
      System.out.println(kc); // *********************************
    }

    @Override
    public Void doInBackground() throws Exception 
    {
        disposition = FileVisitResult.CONTINUE;
        Files.walkFileTree(GUI.p ,fv);
    }
  }

GUI启动SwingWorker的一个新实例,该实例的工作是显示(在JTable中)文件信息,该文件信息是由TASK实例找到的。TASK实例化FileVisitorwalkFileTree开始。在visitFile方法中找到的每个匹配文件都是为SwingWorkerprocess编辑的。

它大部分时间都能工作,但是如果有大量匹配的文件,GUI就会在几秒钟内失去响应;同时,大量的读取和显示已经发生,并且每读取几千个文件就会更新UI。

尽管使用SwingWorker来填充背景中的JTable,但显然(我猜)太多的匹配文件信息太快,跟不上。

所以我才这么说:

尽管visitFile有一个向TERMINATE发送信号的计数器,但process显然远远落后于向JTable添加记录。内部的println显示,随着时间的推移,传递的chunks数量有很大差异,这取决于FileVisitor查找匹配的速率:

代码语言:javascript
复制
41
81
138
250
604
1146
...
1417
1497
1590
1670
1672
1676
1680
1682
1692
1730
1788
1794
1797
1801
1807
1820
1826
1829
1847
1933
2168
10001

visitFile终止后,process必须发送(10001-2168)或7833条记录到JTable,这花费了很长时间,而且用户界面大部分时间都没有响应。事实上,如果最大。比赛是(荒谬的) 10,000,程序挂了许多分钟,但10,000记录在JTable中。

,我不知道该怎么处理没有响应的问题。,我希望能够按下停止按钮,让程序停止。或者能够X (关闭)窗口。不行。

我是不是没有正确地使用SwingWorker ?--我不能让树基于SwingWorker行走,因为我没有可用的循环(它是内部的)。

很明显,javaw占用了25%的CPU时间,并且随着process的缓慢前进,它的内存分配以每秒大约16K的速度递增,直到它最终发布了最后一块。

编辑

我可能已经找到帮助here了。

但是,天哪,close??

我强调了我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-20 19:32:51

响应问题在一行代码中得到解决。

// tca.setDynamicAdjustment(true);

请参阅原始问题中的编辑。

票数 0
EN

Stack Overflow用户

发布于 2015-08-20 16:33:31

我不知道您的问题的解决方案,但我知道这不应该在SwingWorker或它的内部类中完成:

代码语言:javascript
复制
GUI.txtMaxMatches.getText())

您应该获取EDT上的这些信息,并通过其构造函数将其传递到SwingWorker中。

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

https://stackoverflow.com/questions/32123469

复制
相关文章

相似问题

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