TreeModelとTreeNodeの関係
JTreeのモデルには、いくつもの種類があります。固定されたデータを扱うものから、自由にデータ構造を変更できるものまで、働きの異なるものがいくつか揃っているのですね。一般に、javax.swing.treeパッケージの「TreeModel」というインターフェイスを実装したクラスを使います。データを自由に操作できるモデルとして利用する場合、標準では、「DefaultMutableTreeModel」という実装済みクラスが用意されています。
が! このDefaultTreeModelを作ったからといって、それだけですぐにJTreeのデータを構築できるわけではありません。ここが、JListやJTableと違って、JTreeのややこしいところです。JTreeは、階層的な構造を持った形でデータを構築するものですから、モデルに収めていくデータも、こうした構造を保持できるものでなければいけません。普通のStringなどでは、そんな芸当はできませんから、これもやはり専用のクラスを用意する必要があります。
このTreeModelで利用される項目用のクラスが、「TreeNode」というインターフェイスで、DefaultMutableTreeModelでは、これを実装済みの「DeafultMutableTreeNode」というものを使用します。これは自身の下の階層に項目を追加し管理する仕組みを持っており、これを組み合わせて階層構造を作っていくことができます。
package jp.allabout.java;
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class SampleApp extends JFrame{
private static final long serialVersionUID = 1L;
private JTree tree;
private JScrollPane pane;
public SampleApp(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tree = new JTree(getRootNode());
pane = new JScrollPane(tree);
this.add(pane,BorderLayout.CENTER);
this.setSize(new Dimension(200,200));
}
private MutableTreeNode getRootNode(){
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
DefaultMutableTreeNode sub_a = new DefaultMutableTreeNode("Sub Node-A");
root.add(sub_a);
DefaultMutableTreeNode sub_b = new DefaultMutableTreeNode("Sub Node-B");
root.add(sub_b);
sub_a.add(new DefaultMutableTreeNode("Sub Node-A-1"));
sub_a.add(new DefaultMutableTreeNode("Sub Node-A-2"));
sub_b.add(new DefaultMutableTreeNode("Sub Node-B-1"));
sub_b.add(new DefaultMutableTreeNode("Sub Node-B-2"));
return root;
}
public static void main(String[] args) {
new SampleApp().setVisible(true);
}
}
DefaultMutableTreeNodeでノードを組み込んだところ。 |