2011-07-18 5 views
0

私は2つのクラス-AとBを持っています。ファイルのリストを取得するためのGUIを構築しています。クラスBは再帰のためのもので、ファイルの一般的なリストを返します。クラスAはGUI用で、ファイルのリストを取得し、各ファイルを文字列に変換します。取得した巨大なStringデータを取得し、スイングでJTextAreaに設定する方法は?

私の問題は、私が System.out.println(SomeFileName.toString())を呼び出したときです。クラスBでの出力は速くブレイキング中です! しかし、クラスAを介して同じファイルリストを取得し、出力をJTextAreaに追加すると、 処理が100万回遅くなります。

誰でも私に解決策を教えていただけますか?私はバッファを使うべきですか?私はJTextAreaのためにドキュメントを使用することを示唆していました!私はNetBeansを使用しています。

クラスAは、次のようにコーディングされます

 List<File> hoohoo = cr.catalog(partition); 
     Iterator<File> it = hoohoo.iterator(); 
     while (it.hasNext()) { 
      File myf = it.next(); 
      filesText.append(myf.toString() + NEWLINE); 
     } 

クラスBは、この::

public List<File> catalog(String file) { 
    List<File> fileList = new LinkedList<File>(); 
    File myfile = new File(file); 
    File[] fileNme = myfile.listFiles(); 
    for (File name : fileNme) { 
     if (name.isDirectory()) { 
      fileList.add(name); 
      List<File> fist = sub_Catalogue(name); 
      Iterator<File> it = fist.iterator(); 
      while (it.hasNext()) { 
       fileList.add(it.next()); 
      } 
     } else if (name.isFile()) { 
      fileList.add(name); 
     } 
    } 
    return fileList; 
} 

private List<File> sub_Catalogue(File name) { 
    List<File> fileList2 = new LinkedList<File>(); 
    File[] names = name.listFiles(); 
    Humpty: 
    if (names == null) { 
     break Humpty; 
    } else { 
     HooHaa: 
     for (File n : names) { 
      if (n.isFile()) { 
       fileList2.add(n); 
      } else if (n.isDirectory()) { 
       fileList2.add(n); 
       List<File> fileList3 = sub_Catalogue(n); 
       Iterator<File> uf = fileList3.iterator(); 
       while (uf.hasNext()) { 
        fileList2.add(uf.next()); 
       } 
      } 
     } 
    } 
    return fileList2; 
} 
+0

私は自分のシステムに多数のパーティションを持っており、それらすべてのために返されるデータはすばやく処理されます。 Windows 7がインストールされているC:\ドライブとその他のさまざまなプログラム.. –

+0

とJTextAreaにリスナーを追加する必要がありますか? –

+0

コードを投稿してください。魔法のように何が間違っているのかわかりません。 –

答えて

-1

あなたがテキストとして入れする文字列を構築するためのより効率的な方法のように見えますJTextAreaには、StringBuilderを使用します。

List<File> hoohoo = cr.catalog(partition); 
Iterator<File> it = hoohoo.iterator(); 
StringBuilder filesSB = new StringBuilder(); 
while (it.hasNext()) { 
    File myf = it.next(); 
    filesSB.append(myf.toString()); 
    filesSB.append("\n"); 
} 
filesText.setText(filesSB.toString()); 

はここでSwingで効率的にロードするテキストの記事を次のとおりです。
http://users.cs.cf.ac.uk/O.F.Rana/jdc/swing-nov7-01.txt

+0

ここで重要なのは、巨大なリストを取得し、返された各文字列に対して計算を実行することです。それはTextPaneにさらに税金を払わないだろうか?私はそれを試したときにコメントします。ありがとう –

+0

私は、あなたが一度にすべてではなく、ピースでそれを追加することができるということがポイントだと思いますか? doc.insertString(); –

+0

;私はこれを使用しました。ドキュメントも使用しましたが、テキストペインはありません。結果に影響はありません。膨大な数のファイルを持っているC:\ドライブは、まだ膨大な時間を費やしています。アップ! –

2

問題は/呼び出しを追加JTextAreaには、それぞれのsetTextに多くの作業を行っていることである可能性が高いです。そのメソッドを100万回呼び出すと、一度に内部文字列が少しずつ成長し、いくつかの作業が行われます。おそらく、リストのサイズにO(N^2)のような複雑さで終わるでしょう。

次を試してください:StringBuilderを使用して、リスト内のすべての文字列を結合して、ただ1つの文字列を作成します。次に、この単一の大きな文字列を使用してJTextAreaでsetTextを呼び出します。

+0

うん、私はそれもStringBufferクラスで読んでいた..ありがとうトン! –

+0

私は、連続した各行に表示される検索された文字列を望む、それらを組み合わせるための上記の解決策はこの問題を解決しません。 –

+1

@udit:必要に応じて( '\ n') 'を追加することができます – trashgod

関連する問題