资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
如何正确地删除目录树中的节点如何正确地删除目录树中的节点最近目录树做了一下研究,有些心得,特写出来与大家分享。所用到的组件为 java swing 中树结点:javax.swing.tree.DefaultMutableTreeNode和 apche wicket 框架中的树:org.apache.wicket.extensions.markup.html.tree.Tree因为在 apche wicket 框架提供的树组件所用到的叶子点就是 java swing 中的结点,因此这篇文章对于学习 java swing 及 apache wicket 开发的人都有所帮助。言归正转,正文如下。1.自定义一棵树继承 apache wicket 的树,主要对象有 rootNode,currentNode。主要代码如下:列出所使用到的类,有助于你建立自己的类。import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.TreeModel;import org.apache.wicket.Component;import org.apache.wicket.behavior.AbstractBehavior;import org.apache.wicket.extensions.markup.html.tree.Tree;import org.apache.wicket.markup.ComponentTag;import org.apache.wicket.markup.html.WebMarkupContainer;public class CategoryTree extends Tree private static final long serialVersionUID = 4180759886731607206L;private DefaultTreeModel categoryModel; /这个 model 是用来保存数据对象的, /每个结点中的数据都是保存在这个对象中,一个结点对就一个 model 对象private DefaultMutableTreeNode currentNode; /保存当前结点对象private DefaultMutableTreeNode rootNode; /保存根结点对象2 定义鼠标单击的响应事件,获取结点。这一步主要是解决学习wicket 开发的同学所遇到的问 题。因为本文中用到的是 wicket框架,事件的响应机制与 java swing 中不同,不能add*Linstener,所以学习 swing 的同学对应会有点迷惑。不过没关系,逻辑处理是一致,请你继续看。覆盖了父类中的方法。这部分代码参考自网上的一位朋友,在此向这位朋友表示感谢。Overrideprotected void populateTreeItem(WebMarkupContainer item, int level) super.populateTreeItem(item, level); / level 记录了当前结点在整棵树的位置setWebContainer(item);setLevel(level);System.out.println(“item: “+item+“, level: “+level);final DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) item.getDefaultModelObject(); /进行类型转换,转成treeNodeitem.add(new AbstractBehavior() private static final long serialVersionUID = 1604968490897155519L;public void onComponentTag(Component component, ComponentTag tag)super.onComponentTag(component, tag);/判断该结点是否被选中if (getTreeState().isNodeSelected(selectedNode) setCurrentNode(selectedNode);/ 设置当前结点。这是本类中的方法,这一步很关键System.out.println(selectedNode.getUserObject();/通过getUserObject()这个方法,拿到结点中所保存的数据对象。这个数据对象是你自定义的普通 java 对象。要想结点显示你所展现的数据对象信息,需要你重写数据对象的 toString()方法。tag.put(“style“, “background-color:#FFFF66“);/设置选中结点的背景颜色elsetag.put(“class“, “row“););3 删除结点及逻辑处理。删除一个结点的方法有几个,最直接的是 treeNode 的removeFromParent()。但是经常由于逻辑处理不当,程序抛出空指针异常。接下向你讲解正确的删除结点的步骤,以及删除结点后如何 正确地选中其它结点。主要代码如下:/categoryTree 是之前自定义的 tree。先获取当前被选中的结点DefaultMutableTreeNode currentNode=categoryTree.getCurrentNode();/获得当前结点的父结点,下一个结点,前一个结点。这三个结点是关键DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)currentNode.getParent();DefaultMutableTreeNode nextNode = (DefaultMutableTreeNode)currentNode.getNextSibling();DefaultMutableTreeNode previousNode = (DefaultMutableTreeNode)currentNode.getPreviousSibling();System.out.println(currentNode.getUserObject();if(categoryTree.isLeaf(currentNode)/如果被删除的是叶子结点,先将父结点折叠起来。这一步是关键。抛出空指针异常的原因就是没有先执行这一步引起的。具体原因朋友们可以自己分析。/* 可在此处实现删除叶子结点时的业务处理 */categoryTree.getTreeState().collapseNode(parentNode);else/* 可在此处实现删除树结点时的业务处理 */如果是树结点,同理要先将此树结点的父结点折叠起来。categoryTree.getTreeState().collapseNode(currentNode); /因为在删除结点时有其它的业务需要同时进行处理,因此在这里要进行判断叶子结点还是树结点,以做相应的业务处理currentNode.removeFromParent(); /此处实现结点的删除categoryTree.getTreeState().expandNode(parentNode); /结点删除后,再展开父结点ProductCategory nCategory ;if(nextNode!=null)/设置选中结点categoryTree.getTreeState().selectNode(nextNode,true); /下面两句代码是我自己的业务逻辑处理nCategory = (ProductCategory)nextNode.getUserObject(); categoryTree.setCurrentNode(nextNode);else if(previousNode != null)/下面两句代码是我自己的业务逻辑处理nCategory = (ProductCategory)previousNode.getUserObject();categoryTree.getTreeState().selectNode(previousNode,true);/设置选 中结点categoryTree.setCurrentNode(previousNode);else/下面两句代码是我自己的业务逻辑处理nCategory = (ProductCategory)parentNode.getUserObject();categoryTree.getTreeState().selectNode(parentNode,true);/设置选中结点categoryTree.setCurrentNode(parentNode); /删除结点的逻辑流程如下:如果下一个结点存在,就选中下一个结点;否则选中前一个结点;否则选中你结点/最后根据你的业务需要,还要进行其它的业务处理
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号