UML图:
核心代码:
JScrollPane scrollPane = new JScrollPane();
JPanel panel = new JPanel();
scrollPane.setViewportView(panel);
// 构造根节点
Composite rootComposite = new Composite();
rootComposite.name = "根节点";
rootComposite.node = new DefaultMutableTreeNode ( "根节点" );
// 左节点
Composite compositeLeft = new Composite();
compositeLeft.name = "左节点";
compositeLeft.node = new DefaultMutableTreeNode ( "左节点" );
// 构建右节点,添加两个叶子几点,也就是子部件
Composite compositeRight = new Composite();
compositeRight.name = "右节点";
compositeRight.node = new DefaultMutableTreeNode ( "右节点" );
Leaf leaf1 = new Leaf();
leaf1.name = "右-子节点1";
leaf1.node = new DefaultMutableTreeNode ( "右-子节点1" );
Leaf leaf2 = new Leaf();
leaf2.name = "右-子节点2";
leaf2.node = new DefaultMutableTreeNode ( "右-子节点" );
// 左右节点加入 根节点
rootComposite.add(compositeRight);
rootComposite.add(compositeLeft);
// rootComposite.node.add(compositeRight.node);
JTree tree = new JTree(rootComposite.node);
panel.add(tree);
心得:
在实际编程中,抽象类Component中除了用于标识自身的字符串类型的name属性外,还有为 DefaultMutableTreeNode类型的node属性,用于在创建继承自抽象类Component的Composite类以及Leaf类的对象时,能够创建一个关于该对象JTree的节点,以便之后对树的插入(add)、删除(remove)操作。
相应地,在Composite类中,add方法,不仅仅是该类的对象的子树入线性表(用Arraylist表示,用于保存该节点下的子树节点,包括叶子节点)操作,还包括对该对象对应的树节点node添加子树节点的从属关系的操作(例如:a.add(b)中包括a.node.add(b.node)的操作),用于建立一个完整的树。Remove方法和add方法雷同。
另外,由于Leaf类表示树形结构中的叶子节点,其不具有子树、叶子节点,故其继承自Component的add、remove还有getchild方法会相应地设置为空方法体的方法(组合模式的透明形式)。