Listから,親子関係のあるJTreeを作る

結論を言ってしまうと,TreeNodeをimplementsするのが早い.
間違っても,DefaultMutableTreeNodeだけで何とかしようとなんて思わないこと(3敗).

1.TreeNodeの実装クラス

import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Objects;

import javax.swing.tree.TreeNode;

public class MyTreeNode implements TreeNode{
    private String id;
    private MyTreeNode parent;
    private String parentName;
    private String indivisual;
    private List<MyTreeNode> children = new ArrayList<>();

    public MyTreeNode(String code, String indivisual, String parent) {
        this.id  = code;
        this.indivisual = indivisual;
        this.parentName = parent;
    }

    @Override
    public TreeNode getChildAt(int childIndex) {
        return children.get(childIndex);
    }

    @Override
    public int getChildCount() {
        return children.size();
    }

    @Override
    public TreeNode getParent() {
        if(Objects.nonNull(parent)){
            return this.parent;
        }else {
            return null;
        }
    }

    @Override
    public int getIndex(TreeNode node) {
        // TODO 自動生成されたメソッド・スタブ
        return 0;
    }

    @Override
    public boolean getAllowsChildren() {
        return true;
    }

    @Override
    public boolean isLeaf() {
        if(Objects.isNull(children)) {
            return true;
        }else {
            return false;
        }
    }

    @Override
    public Enumeration children() {
        return Collections.enumeration(this.children);
    }

    @Override
    public String toString() {
        return this.indivisual;
    }

    public void add(MyTreeNode futureChild) {
        //
        if(this.getChildCount()>0) {
            for(MyTreeNode node: this.children) {
                System.out.println(node.indivisual);
                if(node.indivisual.equals(futureChild.parentName)) {
                    node.add(futureChild);
                }
            }
        }

        //直属の子として追加
        if(this.indivisual.equals(futureChild.parentName)) {
            this.children.add(futureChild);
        }
    }

}

2. データとツリー作成部分

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;

public class MyTree extends JFrame {
    public static void main(String[] args){

        //List部分
        List<TreeObject> toList = new ArrayList<>();
        toList.add(new TreeObject("10", "root","GG"));
        toList.add(new TreeObject("20", "root","BB"));
        toList.add(new TreeObject("11", "GG", "Sol"));
        toList.add(new TreeObject("12", "GG", "Ky"));
        toList.add(new TreeObject("13", "GG", "Diz"));
        toList.add(new TreeObject("21", "BB", "Jin"));
        toList.add(new TreeObject("22", "BB", "Es"));

        MyTree frame = new MyTree(toList);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(10, 10, 300, 200);
        frame.setTitle("タイトル");
        frame.setVisible(true);
      }

    public MyTree(List<TreeObject> toList) {
        MyTreeNode top = new MyTreeNode("00", "root", "");

        for(TreeObject item: toList ) {
            top.add(new MyTreeNode(item.getCode(), item.getIndividual(), item.getParent()));
        }

        //い つ も の
        JTree tree = new JTree(top);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.getViewport().setView(tree);
        scrollPane.setPreferredSize(new Dimension(280, 180));

        JPanel p = new JPanel();
        p.add(scrollPane);

        getContentPane().add(p, BorderLayout.CENTER);
    }
}

3. 感想

自分がプログラマーじゃないんだなーと思った.
まあ,続けるんですけどね?この仕事.楽しくはあるので.