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 つのルーチンがあり、1 つはディレクトリの処理用、1 つはディレクトリの後処理用、もう 1 つはエラー用です)。

  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