import javaawtDimension; import javaawtColor; import javaxswingJFrame; import javaxswingJPanel; import javaxswingJScrollPane; import javaxswingJTree; import javaxswingBoxLayout; import javaxswingtreeTreePath; import javaxswingtreeDefaultMutableTreeNode; import javaxswingtreeDefaultTreeModel; /* JTree的构造函数: JTree() JTree(Hashtable value) JTree(Object[] value)//只有这个构造函数可以创建多个根结点 JTree(TreeModel newModel) JTree(TreeNode root) JTree(TreeNode root boolean asksAllowsChildren) JTree(Vector value) */ public class JTreeDemo { public static void main (String[] args) { // 构造函数JTree() JTree example = new JTree(); // 构造函数JTree(Object[] value) Object[] letters = { a b c d e }; JTree example = new JTree (letters); // 构造函数JTree(TreeNode root)(TreeNode空) // 用空结点创建树 DefaultMutableTreeNode node = new DefaultMutableTreeNode(); // 定义树结点 JTree example = new JTree (node); // 用此树结点做参数调用 JTree的构造函数创建含有一个根结点的树 // 构造函数JTree(TreeNode root)(同上只是TreeNode非空) // 用一个根结点创建树 DefaultMutableTreeNode node = new DefaultMutableTreeNode( Color ); JTree example = new JTree (node); // 结点不可以颜色默认为白面黑字 examplesetBackground (ColorlightGray); // 构造函数JTree(TreeNode root boolean asksAllowsChildren)(同上只是TreeNode又有不同) // 使用DefaultMutableTreeNode类先用一个根结点创建树设置为可添加孩子结点再添加孩子结点 DefaultMutableTreeNode color = new DefaultMutableTreeNode( Color true ); DefaultMutableTreeNode gray = new DefaultMutableTreeNode ( Gray ); coloradd (gray); coloradd ( new DefaultMutableTreeNode ( Red )); grayadd ( new DefaultMutableTreeNode ( Lightgray )); grayadd ( new DefaultMutableTreeNode ( Darkgray )); coloradd ( new DefaultMutableTreeNode ( Green )); JTree example = new JTree (color); // 构造函数JTree(TreeNode root)(同上只是TreeNode非空) // 通过逐个添加结点创建树 DefaultMutableTreeNode biology = new DefaultMutableTreeNode ( Biology ); DefaultMutableTreeNode animal = new DefaultMutableTreeNode ( Animal ); DefaultMutableTreeNode mammal = new DefaultMutableTreeNode ( Mammal ); DefaultMutableTreeNode horse = new DefaultMutableTreeNode ( Horse ); mammaladd (horse); animaladd (mammal); biologyadd (animal); JTree example = new JTree (biology); horseisLeaf(); horseisRoot(); // 构造函数:JTree(TreeModel newModel) // 用DefaultMutableTreeNodel类定义一个结点再用这个结点做参数定义一个用DefaultTreeMode // 创建一个树的模型再用JTree的构造函数创建一个树 DefaultMutableTreeNode root = new DefaultMutableTreeNode ( Root ); DefaultMutableTreeNode child = new DefaultMutableTreeNode ( Child ); DefaultMutableTreeNode child = new DefaultMutableTreeNode ( Child ); DefaultMutableTreeNode child = new DefaultMutableTreeNode ( Child ); rootadd (child); childadd (child); childadd (child); DefaultTreeModel model = new DefaultTreeModel (root); JTree example = new JTree (model); JPanel panel = new JPanel(); panelsetLayout ( new BoxLayout (panel BoxLayoutX_AXIS)); panelsetPreferredSize ( new Dimension ( )); paneladd ( new JScrollPane (example)); // JTree必须放在JScrollPane上 paneladd ( new JScrollPane (example)); paneladd ( new JScrollPane (example)); paneladd ( new JScrollPane (example)); paneladd ( new JScrollPane (example)); paneladd ( new JScrollPane (example)); paneladd ( new JScrollPane (example)); JFrame frame = new JFrame ( JTreeDemo ); framesetDefaultCloseOperation (JFrameEXIT_ON_CLOSE); framesetContentPane (panel); framepack(); frameshow(); } } ×××××××××××××××××××××××××××××××××××××××××××××× 在实际开发过程中会经常使用JTree组件平时会遇到这样或那样的问题在此将偶得一点经验写下来与大家共享希望对大家有所帮助 private JTree jtNetDevice;//数组件申明 private JScrollPane jspTree;//滚动面板申明 初始化 DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(root); jtNetDevice = new JTree(rootNode); jtNetDevicesetAutoscrolls(true); getTreeSelectionModel()setSelectionMode(TreeSelectionModelSINGLE_TREE_SELECTION);//设置单选模式 jspTree = new JScrollPane(); jspTreegetViewport()add(jtNetDevice null); 三个经常使用的取值函数 private DefaultTreeModel getTreeModel(){ return (DefaultTreeModel)jtNetDevicegetModel(); } private DefaultMutableTreeNode getRootNode(){ return (DefaultMutableTreeNode)getTreeModel()getRoot(); } private TreeSelectionModel getTreeSelectionModel(){ return jtNetDevicegetSelectionModel(); } 根据node得到path TreePath visiblePath = new TreePath(getTreeModel()getPathToRoot(node)); 根据Path展开到该节点 jtNetDevicemakeVisible(visiblePath); 根据path设定该节点选定 jtNetDevicesetSelectionPath(visiblePath); 选中节点的方法 首先根据节点得到树路径其中chosen为需要选中的节点 TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jtNetDevicegetModel()) getPathToRoot(chosen)); 然后根据Path选中该节点 jtNetDevicesetSelectionPath(visiblePath); 滚动到可见位置 jtNetDevicescrollPathToVisible(visiblePath); 给JTree添加右键弹出菜单 void jtNetDevice_mouseReleased(MouseEvent e) { if (eisPopupTrigger()) { jPopupMenushow(egetComponent() egetX() egetY());//弹出右键菜单 } } 关于JTree的展开 // If expand is true expands all nodes in the tree // Otherwise collapses all nodes in the tree public void expandAll(JTree tree boolean expand) { TreeNode root = (TreeNode)treegetModel()getRoot(); // Traverse tree from root expandAll(tree new TreePath(root) expand); } private void expandAll(JTree tree TreePath parent boolean expand) { // Traverse children TreeNode node = (TreeNode)parentgetLastPathComponent(); if (nodegetChildCount() >= ) { for (Enumeration e=nodechildren(); ehasMoreElements(); ) { TreeNode n = (TreeNode)enextElement(); TreePath path = parentpathByAddingChild(n); expandAll(tree path expand); } } // Expansion or collapse must be done bottomup if (expand) { treeexpandPath(parent); } else { llapsePath(parent); } } 如何遍历JTree // 创建树 JTree tree = new JTree(); // 添加树节点 // 遍历所有节点 visitAllNodes(tree); // 仅遍历展开的节点 visitAllExpandedNodes(tree); // Traverse all nodes in tree public void visitAllNodes(JTree tree) { TreeNode root = (TreeNode)treegetModel()getRoot(); visitAllNodes(root); } public void visitAllNodes(TreeNode node) { // node is visited exactly once process(node); if (nodegetChildCount() >= ) { for (Enumeration e=nodechildren(); ehasMoreElements(); ) { TreeNode n = (TreeNode)enextElement(); visitAllNodes(n); } } } // Traverse all expanded nodes in tree public void visitAllExpandedNodes(JTree tree) { TreeNode root = (TreeNode)treegetModel()getRoot(); visitAllExpandedNodes(tree new TreePath(root)); } public void visitAllExpandedNodes(JTree tree TreePath parent) { // Return if node is not expanded if (!treeisVisible(parent)) { return; } // node is visible and is visited exactly once TreeNode node = (TreeNode)parentgetLastPathComponent(); process(node); // Visit all children if (nodegetChildCount() >= ) { for (Enumeration e=nodechildren(); ehasMoreElements(); ) { TreeNode n = (TreeNode)enextElement(); TreePath path = parentpathByAddingChild(n); visitAllExpandedNodes(tree path); } } } |