1

我已经修改了我的 Windows 7 搜索程序,将匹配的文件写入JTable. 在此之前,我正在写一个JTextArea. 输出很丑;因此JTable输出。但是JTable,如果搜索数千个文件,程序会时不时地变得无响应。(不是这样JTextArea。非常顺利。)

我的问题是如何提高响应能力。

我有一个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{

这是run

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

这是树遍历的主要例程(还有其他 3 个,一个用于处理目录,一个用于后处理,一个用于错误):

  public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
    if(a.isSymbolicLink())
      return SearchyGUI.disposition;
    File file = new File(f.getParent().toString(), f.getFileName().toString());
    try 
    {
      if(f.getFileName().toString().toLowerCase().matches(fPatt.toLowerCase().trim())
          report(s);
    } catch (MalformedURLException | SAXException | TikaException ex) {msgbox(ex.toString());}
    return SearchyGUI.disposition;
  }

匹配的文件及其信息被写入JTable

      private static void report(...){
        ArrayList<String> rowData = new ArrayList<>(4);
              rowData.add(date);
              rowData.add(size);
              rowData.add(filename);    
              rowData.add(path);
              dftTableModel.addRow(new Object[]{rowData.get(0),rowData.get(1),rowData.get(2),rowData.get(3)});
          }
          catch (Exception e)
          { 
            SearchyGUI.disposition = FileVisitResult.TERMINATE;
          }
      }

为了提高响应能力,我不知道是否需要另一个Thread来写入JTable或者是否需要使用SwingWorker. 无论哪种情况,我都不确定如何实施。

假设另一个Thread,我会把report方法变成一个类implements Runnable吗?我在可视化实现时遇到了麻烦,但如果必须的话,我可能会弄清楚。

我曾经在这个程序中使用过SwingWorker,可能不正确(没有Thread)。当输出区域不断闪烁时,我放弃了它。所以我不热衷于走那条路,但如果可取的话,我会弄清楚的。

我不认为这个问题属于“意见”领域。需要有关如何提高响应能力的建议。如果有人可以提前指出错误,我只是不想走错路。

在此处输入图像描述

4

0 回答 0