GUIにおいて、ツリー状で表示し、選択する場合に使うクラスがJTreeです。
クラス継承構造は次のようになっています。
java.lang.Object
└java.awt.Container
└javax.swing.JComponent
└javax.swing.JTree
詳細は次のリンクで調べましょう。
以下でデフォルトコンストラクタのJTreeを配置した実行とコード例を示します。
(デフォルトコンストラクタの場合は、始めからサンプル的なノードは構築されています。)
クリックでノードを展開してみましょう、展開の仕方によって、部分的なノードが隠れて
しまうことが確認できるでしょう。
これより、スクロール機能のJScrollPaneクラスオブジェクトに入れて使うタイプの部品と分ります。
JFameのコード
、JScrollPane使用
package test; import java.awt.*; import javax.swing.*; public class TestJTree extends JFrame { Container container;// ここに配置する時の入れ物取得 JTree jTree = new JTree(); JScrollPane jscrollPan = new JScrollPane(this.jTree);//jTreeを入れたスクロールペイン生成 public TestJTree(){//コンストラクタ this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.container = getContentPane();// 入れ物取得 this.container.add(jTree, BorderLayout.CENTER); //ツリーを追加 } public static void main(String[] args){ TestJTree frame = new TestJTree(); frame.jTree.setPreferredSize(new Dimension(200,150)); frame.pack(); frame.setVisible(true); } }
ツリーの各ノードは、
TreeNodeインタフェースの継承クラスでなければなりません。
その継承クラスとして汎用的なノードに使うDefaultMutableTreeNodeが
用意されているので、一般的には、これを利用します。
これで指定したノードで、その子にノードを追加したり、削除ができます。
そのためには、対象となるJTreeオブジェクトから希望のノードを取得する必要がありますが、
JTreeクラスにはその機能がなく、
それはTreeModelインターフェイス継承クラスに任されています。
そしてこのインターフェイスを実装したクラスとしてDefaultTreeModelクラスが
用意されています。
そして、JTreeオブジェクトからTreeModelインターフェイス実装オブジェクトを
取得し、それで希望のTreeNodeインタフェース実装オブジェクトを基準にして、
子となるTreeNodeインタフェース実装オブジェクトを操作する形態になります。
つまり、JTreeオブジェクトからDefaultTreeModelオブジェクトを取得し、
それから希望のDefaultMutableTreeNodeオブジェクトを基準にして、
子となるDefaultMutableTreeNodeオブジェクトを追加したり
削除が可能となります。以下で確認ください。
JFameのコード
、
package test;
import java.awt.*;
import java.awt.event.*;//ActionListenerやActionEvent用
import javax.swing.*;
import javax.swing.tree.DefaultTreeModel;//TreeModelインターフェイス実装クラス
import javax.swing.tree.DefaultMutableTreeNode;//TreeNodeインターフェイス実装クラス
public class TestJTree extends JFrame implements ActionListener
{
Container container;// ここに配置する時の入れ物取得
JTree jTree = new JTree();
JScrollPane jscrollPan = new JScrollPane(this.jTree);//jTreeを入れたスクロールペイン生成
JButton btn = new JButton("確認ボタン");
public TestJTree(){//コンストラクタ
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.container = getContentPane();// 入れ物取得
this.container.add(jTree, BorderLayout.CENTER); //ツリーを追加
this.container.add(btn, BorderLayout.NORTH); //操作用ボタン追加
btn.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
DefaultTreeModel treeModel = (DefaultTreeModel)jTree.getModel();
DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode)treeModel.getRoot();
rootNode.removeAllChildren();
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("ABCD");
rootNode.add(node1);//追加
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("opqrstu");
rootNode.add(node2);
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("XYZ");
rootNode.add(node3);
DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("AB");
node1.add(node11);//node1の末尾に追加
DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("CD");
node1.add(node12);
rootNode.remove(node2);//削除
node2.setUserObject("OPQRS");//ノード変更
rootNode.insert(node2, 1);//挿入
treeModel.reload();//上記の構成で、Treeを更新させる。
}
public static void main(String[] args){
TestJTree frame = new TestJTree();
frame.jTree.setPreferredSize(new Dimension(200,150));
frame.pack();
frame.setVisible(true);
}
}