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); } }