[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re:




>ありがとうございます!
>感謝感激です。お教え頂いたソースをベースにして作成していこう
>と思います。

投稿したソースはただ単にHTML Table形式でコンソール出力するだけです。

TreeTable.java では java.util.Vector を使って検索結果を蓄積していますが、
ツリー・コントロールのようなものとして表示するには Vector ではなく
javax.swing.tree.DefaultMutableTreeNode を使う必要があります。

TreeTable.java で Vector に addElement() している個所を、
DefaultMutableTreeNode の add() に書きかえる必要があります。

TreeNode.java では HTML の Table として表示するために、
次の3つのものを addElement() していました。
 0: "<TR><TD>" ... "</TD>" という文字列
 1: ファイル/ディレクトリー名
 2: ノードの深さ

javax.swing.JTree を使うのであれば、ファイル/ディレクトリー名を
add() するだけでいいと思います。

TreeTable.java では、retrieve() メソッドに String pref という引数と
int node_depth という引数をとっていました。

>  public void retrieve(File dir, String pref, int node_depth) {

DefaultMutableTreeNode を使うのであれば、

  public void retrieve(File dir, DefaultMutableTreeNode) {

こんな感じで良いでしょう。

>      tree.addElement(before);                           // "<TR><TD>...</TD>"
>      tree.addElement(subdirs[i].getName());             // ディレクトリー名
>      tree.addElement(new Integer(node_depth));          // 深さ
>      retrieve(subdirs[i], pref + next, node_depth + 1);

ここは、 

      DefaultMutableTreeNode node =
        new DefalutMutableTreeNode(subdirs[i]);
      parent.add(node);
      retrieve(subdirs[i], node); // 再帰探索

こんな感じになると思います。

あ、そうだ。
いちばん上のノードを最初に add しておく必要があります。

>public class TreeTable {
>  private static final String LEAF     = "<TD>├─</TD>"; // 途中の子供
>  private static final String BOTTOM   = "<TD>└─</TD>"; // 最後の子供
>  private static final String SUBTREE  = "<TD>│ </TD>"; // 途中の子供の下位ノード
>  private static final String BLANK    = "<TD>  </TD>"; // 最後の子供の下位ノード
>
>  static int depth = 0; // 全体の深さ

この depth の代わりに

  private DefaultMutableTreeNode root = null;

というのが必要です。(良く考えたら static にしてはいけなかったと思う^^;)

あと、

>  public static void main(String[] args) {
>    TreeTable ttable = new TreeTable();
>    ttable.tree.addElement("<TR>");         // "<TR>
>    ttable.tree.addElement(args[0]);        // 最上位のディレクトリー名
>    ttable.tree.addElement(new Integer(0)); // 深さ0
>    ttable.retrieve(args[0]);
>    ttable.showTree();

ここは、

  public static void main(String[] args) {
    TreeTable ttable = new TreeTable();
    ttable.retrieve(args[0]);
    ttable.showTree();

これだけで良くて、

>  public void retrieve(String dir) {
>    retrieve(new File(dir), "<TR>", 1);
>  }

ここを、

  public void retrieve(String dir) {
    retrieve(new File(dir), null);
  }

こんな感じに変える必要があります。

parent が null だと実行時に NullPoniterException が発生するので、
retrieve() の適当な個所に

  if (root == null) root = node;

という感じの行を追加してください。

>その前にまずjavaの基本から学ばねばなりません。
>完成まで時間がかかると思いますが頑張って作ります。

青柳さんの『Java APIプログラミングガイド』は名著なので1冊常備してください。
ただしこの本は JDK 1.0 の頃の本なので、JTree や DefaultMutableTreeNode の
ことは書いてありません。
(青柳さんは新しい本を書いているようで期待してます)

私は読んだことがないのですが、『Javaプログラミング・クイックリファレンス』という
JDK 1.1 以上に対応したサンプルソースがたくさん載っている本があります。
この本もなかなか評判良いです。
-- 
えんどう やすゆき <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/ (Java互助会ホームページ)