除了以节点的观念(TreeNode)建立树之外,你可以用data model的模式建立树。树的data model称为TreeModel,用此模式的好处 是可以触发相关的树事件,来处理树可能产生的一些变动。TreeModel是一个interface,里面定义了8种方法;如果你是一个喜欢自己 动手做的人,或是你想显示的数据格式很复杂,你可以考虑直接实作TreeModel界面中所定义的方法来构造出JTree.TreeModel界面 的方法如下所示:
你可以实作出这8种方法,然后构造出自己想要的JTree,不过在大部份的情况下我们通常不会这样做,毕竟要实作出这8种方法不 是件很轻松的事,而且java本身也提供了一个默认模式,叫做DefaultTreeModel,这个类已经实作了TreeModel界面,也另外提供许 多实用的方法。利用这个默认模式,我们便能很方便的构造出JTree出来了。下面为DefaultTreeModel的构造函数与范例:
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; import com.incors.plaf.alloy.*;//组件的下载网址http://www.incors.com/lookandfeel/ /*将alloy.jar放在c:\j2sdk1.4.0\jre\lib\ext\目录下. */ public class TreeDemo3 { public TreeDemo3() { JFrame f = new JFrame("TreeDemo"); Container contentPane = f.getContentPane(); DefaultMutableTreeNode root = new DefaultMutableTreeNode("资源管理器"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("我的公文包"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("我的电脑"); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("收藏夹"); DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("Readme"); DefaultTreeModel treeModel = new DefaultTreeModel(root); /* * DefaultTreeModel类所提供的insertNodeInto()方法加入节点到父节点的数量. * 利用DefaultMutableTreeNode类所提供的getChildCount()方法取得目前子节点的数量. */ treeModel.insertNodeInto(node1, root, root.getChildCount()); treeModel.insertNodeInto(node2, root, root.getChildCount()); treeModel.insertNodeInto(node3, root, root.getChildCount()); treeModel.insertNodeInto(node4, root, root.getChildCount()); DefaultMutableTreeNode leafnode = new DefaultMutableTreeNode("公司文件"); // DefaultTreeModel类所提供的insertNodeInto()方法加入节点到父节点的数量. treeModel.insertNodeInto(leafnode, node1, node1.getChildCount()); leafnode = new DefaultMutableTreeNode("个人信件"); treeModel.insertNodeInto(leafnode, node1, node1.getChildCount()); leafnode = new DefaultMutableTreeNode("私人文件"); treeModel.insertNodeInto(leafnode, node1, node1.getChildCount()); leafnode = new DefaultMutableTreeNode("本机磁盘(C:)"); treeModel.insertNodeInto(leafnode, node2, node2.getChildCount()); leafnode = new DefaultMutableTreeNode("本机磁盘(D:)"); treeModel.insertNodeInto(leafnode, node2, node2.getChildCount()); leafnode = new DefaultMutableTreeNode("本机磁盘(E:)"); treeModel.insertNodeInto(leafnode, node2, node2.getChildCount()); DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("网站列表"); treeModel.insertNodeInto(node31, node3, node3.getChildCount()); leafnode = new DefaultMutableTreeNode("奇摩站"); treeModel.insertNodeInto(leafnode, node3, node3.getChildCount()); leafnode = new DefaultMutableTreeNode("职棒消息"); treeModel.insertNodeInto(leafnode, node3, node3.getChildCount()); leafnode = new DefaultMutableTreeNode("网络书店"); treeModel.insertNodeInto(leafnode, node3, node3.getChildCount()); try { LookAndFeel alloyLnF = new AlloyLookAndFeel(); UIManager.setLookAndFeel(alloyLnF); } catch (UnsupportedLookAndFeelException ex) { // You may handle the exception here } // this line needs to be implemented in order to make JWS work properly UIManager.getLookAndFeelDefaults().put("ClassLoader", getClass().getClassLoader()); // 以TreeModel建立JTree。 JTree tree = new JTree(treeModel); /* 改变JTree的外观* */ tree.putClientProperty("JTree.lineStyle", "Horizontal"); /* 改变JTree的外观* */ JScrollPane scrollPane = new JScrollPane(); scrollPane.setViewportView(tree); contentPane.add(scrollPane); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String args[]) { new TreeDemo3(); } }