Idea插件之JTree
树型结构是比较常规的分类思维方式,好的分类规则能事半功倍,比如文件目录、日常开发的代码,时序图是树型结构的另一种展示形式。这里介绍插件中JTree的基本结构。
JTree对象生成及配置配置树对象paramtreethis。treenewJXTree();paramtreePaneltreePanelnewJScrollPane();滑动对象paramrootVisible是否展示根节点publicstaticvoidconfigTree(JTreetree,JScrollPanetreePanel,booleanrootVisible){tree配置DefaultTreeModelmodel(DefaultTreeModel)tree。getModel();model。setRoot(newDefaultMutableTreeNode());渲染树节点对象tree。setCellRenderer(newMTTreeCellRenderer());根节点不展示tree。setRootVisible(rootVisible);true或false决策根节点左上角折号是否展示tree。setShowsRootHandles(true);treePanel。setViewportView(tree);快速搜索newTreeSpeedSearch(tree);用于loading的关键配置ComponentUtil。putClientProperty(tree,ANIMATIONINRENDERERALLOWED,true);ComponentUtil。putClientProperty(tree,AUTOEXPANDALLOWED,false);ComponentUtil。putClientProperty(tree,SHRINKLONGRENDERER,true);}JTree事件包装paramtreeparamtreeContext树所属的对象,一般用于树操作时需要数据传递publicstaticvoidaddTreeEvent(JTreetree,TreePanelMarktreeContext){树节点被选中时tree。addTreeSelectionListener(e{DefaultMutableTreeNodemutableTreeNode(DefaultMutableTreeNode)tree。getLastSelectedPathComponent();if(nullmutableTreeNode!(mutableTreeNode。getUserObject()instanceofMTTreeCell)){return;}((MTTreeCell)mutableTreeNode。getUserObject())。treeSelectionListener(tree,mutableTreeNode,treeContext);});树节被点击,单击、双击tree。addMouseListener(newMouseAdapter(){OverridepublicvoidmouseClicked(MouseEvente){if(SwingUtilities。isLeftMouseButton(e)){finalintdoubleClick2;if(e。getClickCount()doubleClick){DefaultMutableTreeNodemutableTreeNode(DefaultMutableTreeNode)tree。getLastSelectedPathComponent();if(nullmutableTreeNode!(mutableTreeNode。getUserObject()instanceofMTTreeCell)){return;}((MTTreeCell)mutableTreeNode。getUserObject())。doubleClick(tree,mutableTreeNode,treeContext);}}}右键菜单OverridepublicvoidmouseReleased(MouseEvente){if(SwingUtilities。isRightMouseButton(e)){TreePathpathtree。getPathForLocation(e。getX(),e。getY());tree。setSelectionPath(path);DefaultMutableTreeNodemutableTreeNode(DefaultMutableTreeNode)tree。getLastSelectedPathComponent();if(nullmutableTreeNode!(mutableTreeNode。getUserObject()instanceofMTTreeCell)){return;}((MTTreeCell)mutableTreeNode。getUserObject())。rightClick(tree,mutableTreeNode,e,treeContext);}}});按回车键跳转到对应方法tree。addKeyListener(newKeyAdapter(){OverridepublicvoidkeyPressed(KeyEvente){super。keyPressed(e);if(e。getKeyCode()KeyEvent。VKENTER){DefaultMutableTreeNodemutableTreeNode(DefaultMutableTreeNode)tree。getLastSelectedPathComponent();if(nullmutableTreeNode!(mutableTreeNode。getUserObject()instanceofMTTreeCell)){return;}((MTTreeCell)mutableTreeNode。getUserObject())。keyEnter(tree,mutableTreeNode,treeContext);}}});}JTree递归包装成树节点
一般是一个userObject对应一个DefaultMutableTreeNode,树型关系由DefaultMutableTreeNode来维护,后面删除、添加、上移、下移方便处理。渲染遍历树paramtreeparamrootTreeCellpublicstaticDefaultMutableTreeNoderenderRepeaterTree(JTreetree,MTTreeCellrootTreeCell){if(nullrootTreeCell){returnnull;}DefaultMutableTreeNoderootnewDefaultMutableTreeNode(rootTreeCell);renderRepeaterTreeSub(rootTreeCell。subTreeCell(),root);DefaultTreeModelmodel(DefaultTreeModel)tree。getModel();model。setRoot(root);expandOrCollapAll(tree,newTreePath(tree。getModel()。getRoot()),true);returnroot;}递归遍历数据结构生成树节点paramsubTreeCellsparamparentNodepublicstaticvoidrenderRepeaterTreeSub(ListMTTreeCellsubTreeCells,DefaultMutableTreeNodeparentNode){if(CollectionUtils。isEmpty(subTreeCells)){return;}for(MTTreeCellsubTreeCell:subTreeCells){DefaultMutableTreeNodetreeNodenewDefaultMutableTreeNode(subTreeCell);parentNode。add(treeNode);renderRepeaterTreeSub(subTreeCell。subTreeCell(),treeNode);}}JTree展开、收起树节点展开tree视图paramparenttreePathparamexpand是否展开publicstaticvoidexpandOrCollapAll(NotNullJTreetree,NotNullTreePathparent,booleanexpand){TreeNodenode(TreeNode)parent。getLastPathComponent();if(node。getChildCount()0){for(Enumerationlt;?enode。children();e。hasMoreElements();){TreeNoden(TreeNode)e。nextElement();TreePathpathparent。pathByAddingChild(n);expandOrCollapAll(tree,path,expand);}}展开或收起必须自下而上进行if(expand){tree。expandPath(parent);}else{tree。collapsePath(parent);}}JTree重新加载
当子节点变化后需要重新加载已经变化的子节点重新加载paramjTreeparamnode变化的子节点的父节点publicstaticvoidreload(JTreejTree,DefaultMutableTreeNodenode){((DefaultTreeModel)jTree。getModel())。reload(node);}JTree渲染对象RendererpublicclassMTTreeCellRendererextendsColoredTreeCellRenderer{渲染每个节点paramtreeparamvalueparamselectedparamexpandedparamleafparamrowparamhasFocusOverridepublicvoidcustomizeCellRenderer(NotNullJTreetree,Objectvalue,booleanselected,booleanexpanded,booleanleaf,introw,booleanhasFocus){Objectobj((DefaultMutableTreeNode)value)。getUserObject();if(objinstanceofMTTreeCell){MTTreeCellnode(MTTreeCell)obj;IconloadingIconnode。loadingIcon();if(null!loadingIcon){setIcon(loadingIcon);}elseif(null!node。selfControlSelect()){if(node。selfControlSelect()){setIcon(node。iconSelected());}else{setIcon(node。iconUnselected());}}else{if(selected){if(null!node。iconSelected()){setIcon(node。iconSelected());}}else{if(null!node。iconUnselected()){setIcon(node。iconUnselected());}}}if(nullnode。fontAttributes()){append(node。cellShow());}else{append(node。cellShow(),node。fontAttributes());}}}}