JTree には下記のようなコンストラクタが用意されています。
JTree()
– 後から setModel(TreeModel newModel)
でデータをセットする。JTree(Object[] value)
JTree(Vector<?> value)
JTree(Hashtable<?,?> value)
JTree(TreeModel newModel)
JTree(TreeNode root)
JTree(TreeNode root, boolean asksAllowsChildren)
配列を JTree のコンストラクタに渡す場合は、配列の入れ子構造を作成すれば、多階層のツリーを作成することができます。
ただし、各オブジェクトの toString()
メソッドの結果がノードのラベルとして表示されてしまうので、自身が配列オブジェクトとなるノードは、[L.java.lang.Object;@1050e1f
のようなラベルで表示されてしまいます。
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
public class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
public MyPanel() {
Object[] arr = new Object[] {
"aaa", "bbb", "ccc",
new Object[] {100, 200, 300},
System.getProperties()
};
JTree tree = new JTree(arr);
JScrollPane scrollPane = new JScrollPane(tree);
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
}
}
Vector から JTree を作成する場合も、ほぼ同様に作成できます。
Vector<String> vec = new Vector<String>();
vec.add("aaa");
vec.add("bbb");
vec.add("ccc");
JTree tree = new JTree(vec);
Hashtable から JTree を作成する場合は、Hashtable のキーだけがノードとして表示されます。
Hashtable<String, Integer> table = new Hashtable<String, Integer>();
table.put("aaa", 100);
table.put("bbb", 200);
table.put("ccc", 300);
JTree tree = new JTree(table);
JTree のコンストラクタでルートノードとなる TreeNode オブジェクトを指定することでも、 JTree をインスタンス化できます。 TreeNode は実際には親ノードや子ノードを取得するためのメソッドを定義したインタフェースであり、これを実装した DefaultMutableTreeNode クラスを使用することで簡単にツリーを構成できます。
DefaultMutableTreeNode のコンストラクタは任意のオブジェクトをパラメータとして受け取り、JTree はこのオブジェクトの toString()
が返した文字列を各ノードに表示します。
DefaultMutableTreeNode クラスには、子ノードとなる add()
メソッドが定義されており、このメソッドを使って、階層構造を作ることができます。
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
@SuppressWarnings("serial")
public class MyPanel extends JPanel {
public MyPanel() {
JTree tree = new JTree(createNodes());
JScrollPane scrollPane = new JScrollPane(tree);
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
}
private class Person {
private String name;
public Person(String name) { this.name = name; }
@Override public String toString() { return name; }
}
private TreeNode createNodes() {
// Create nodes.
DefaultMutableTreeNode top = new DefaultMutableTreeNode("Top");
DefaultMutableTreeNode work = new DefaultMutableTreeNode("Work");
DefaultMutableTreeNode priv = new DefaultMutableTreeNode("Private");
DefaultMutableTreeNode p1 = new DefaultMutableTreeNode(new Person("Name 1"));
DefaultMutableTreeNode p2 = new DefaultMutableTreeNode(new Person("Name 2"));
DefaultMutableTreeNode p3 = new DefaultMutableTreeNode(new Person("Name 3"));
DefaultMutableTreeNode p4 = new DefaultMutableTreeNode(new Person("Name 4"));
DefaultMutableTreeNode p5 = new DefaultMutableTreeNode(new Person("Name 5"));
DefaultMutableTreeNode p6 = new DefaultMutableTreeNode(new Person("Name 6"));
// Construct a hierarchy.
top.add(work);
top.add(priv);
work.add(p1);
work.add(p2);
work.add(p3);
priv.add(p4);
priv.add(p5);
priv.add(p6);
return top;
}
}