ツリーモデルの表示

  1. ツリーモデル
    ツリーは階層型のデータ構造を表現する手法です。ファイルシステムの、フォルダとファイルの構造はツリーモデルの典型的な例です。また、本の章節構造もツリー構造の手の例です。
     Swingのツリー部品はツリーモデルを構築・表示し、編集したり、クリックされた節点のツリーのパスを取得することができます。

  2. ツリーの構造

    1. ツリーの構造
      ツリーは一つの親(ルート)節点を持ち、その親に複数の子供の節点が「階層的」に接続します。子供の節点には、それを親とする子供の節点が接続します。ツリーを構成する節点の親節点は1個のみです。したがって、ルートノードから指定された節点までの経路は一意に定まります。

    2. ツリーの構築
      親を指定しその親に接続する子供の節点を追加することで、ツリーを構築することができます。また、親を指定しその親に属する子供を削除することで、ツリーの節点を削除できます。

    3. ツリーの表示
       Swingによるツリーの表示例を紹介します。ルート節点のrootに A,B の二つの節点が接続しています。Aのはa,bの二つの子供が、Bには1つの子供の節点が接続しています。子供の節点をもつ親節点はフォルダの形式で表示され、子供のない節点は、○で表示されています。
       属する子供の節点の表示/非表示を選択できます。右側の図は、Aの子供の節点表示を停止した例で、節点Aの前の、アイコン をマウスでクリックして表示/非表示を切替えることができます。表示形式は対応するJDKのバージョンで変化します。

         

  3. プロジェクト
    1. 配置
      中央部にSwingContainerからScrollContainerを配置し、その中に、Swingの JTREEを組み込みます。また、下部に節点の名前を入力するJTextFeild、その下に、兄弟節点を追加する add ボタンと、子供を追加・削除する child 、delete ボタンを追加します。
       各ボタンに対し、イベント処理を実行するメソッドを作成します。

    2. DefaultTreeModelクラス
       ツリーのデータ構造を作成し、それと、GUI部品の jTree に対応付けをします。これで、データ構造を編集すると、GUI部品の表示が自動的に変更されます。ツリーのデータ構造は DefaultTreeModel クラスを利用します。まず、"root"の名前で、ルートとなる節点を作成します。
       DefaultMutableTreeNode rootnode=new DefaultMutableTreeNode("root");
      この節点を元に、ツリーを作成します。
       DefaultTreeModel tmodel1=new DefaultTreeModel(rootnode);
      これを、GUI部品で生成された、
       private JTree jTree1 = new JTree( );
      に次のように結合します。
       private JTree jTree1 = new JTree(tmodel1);

    3. jChildButton2_actionPerformed(ActionEvent e)
       childボタンのイベント処理を行うメソッドで、子供となる節点を追加します。このボタンを押す前に、親となる節点をマウスで選択しておきます。また、節点の名前を jTextField1 に記入しておきます。
      最初に追加する節点を作成します。節点の名前は、
       DefaultMutableTreeNode tn=new DefaultMutableTreeNode(jTextField1.getText());
      次に
       jTree1.getSelectionPath(); 
      でマウスで選択した節点のパスtpを取得し、tp.getLastPathComponent() でパスの最終節点をptnに取り出します。また、
        tmodel1.getChildCount(ptn)
      で、ptn に接続する子供の数を num 取得します。以上の準備で
       tmodel1.insertNodeInto(tn,ptn,num);
      で、tnをptnのnum番目の子供として追加します。
        void jChildButton2_actionPerformed(ActionEvent e) {
          DefaultMutableTreeNode tn=new DefaultMutableTreeNode(jTextField1.getText());
          TreePath tp = jTree1.getSelectionPath();
          if(tp == null) return;
          DefaultMutableTreeNode ptn=(DefaultMutableTreeNode)tp.getLastPathComponent();
          int num=tmodel1.getChildCount(ptn);
          tmodel1.insertNodeInto(tn,ptn,num);
          jTree1.expandRow(jTree1.getLeadSelectionRow());
          repaint();
        }
      jTree1.expandRow(jTree1.getLeadSelectionRow());は、選択している行の節点を「展開」して子供を表示する指定です。これは、親節点の左の +,- をクリックするのと同様な機能です。

    4. jAddButton1_actionPerformed(ActionEvent e)
       兄弟ノードの追加を行うメソッドです。これは、指定した節点の兄弟として節点を追加します。先の、親を指定した追加とほぼ同じです。プログラムは兄弟から親の節点を取得する機能が追加されるだけで、他は同様です。

    5. jDeleteButton1_actionPerformed(ActionEvent e)
       指定節点を削除する機能です。クリックされた節点のパス(親からの経路)を求め、さおの最終節点を削除する、ことになります。ルートとなる節点 rootnode は削除しないよう、チェックをしています。

        void jDeleteButton1_actionPerformed(ActionEvent e) {
         TreePath tp = jTree1.getSelectionPath();
         if((tp != null)&&(tp.getLastPathComponent() != rootnode)){
           tmodel1.removeNodeFromParent(
               (DefaultMutableTreeNode)tp.getLastPathComponent());
         }
        }

  4. 実行
     ルートノードを選択し、節点の名前を書き込んでから、childボタンを押します。これで、指定した名前の節点が作成されます。別の名前を記入し、childボタンを押すと子供が追加されます。追加した子供を選択し、childボタンを押すと、その子供が追加されます。ルート節点からは 「孫」が生成されます。子供ができた親節点は フォルダ のアイコンに変わります。
     add ボタンを押すと、選択した節点と兄弟の節点として追加されます。また、deleteボタンを押すと選択した節点が削除されます。



  5. ダウンロード
    このプロジェクトをダウンロードできます。次の行をクリックして、jTree.exeファイルを適当なフォルダに保存します。
    ダウンロード開始
    このファイルは自己解凍型の圧縮ファイルです。このファイルを実行すると指定したフォルダに必要なファイルが生成されます。