DefaultTreeModel和Wicket Tree:setAsksAllowsChildren不起作用

我在Web应用程序中使用Wicket的Tree组件。 但是空文件夹以文件方式显示。 像这样: 在此处输入图像描述

Bellow是我使用DefaultTreeModel和Tree的地方:

PDMinterface pdmI = new PDMinterface(); DefaultMutabletreeNode rootTreeNode = pdmI.getDocTree(); //文档树根结点,由PDM接口提供 DefaultTreeModel treeModel = new DefaultTreeModel(rootTreeNode); treeModel.setAsksAllowsChildren(true); 

我确定folder5设置为允许孩子:

 public DefaultMutableTreeNode getDocTree(){ DefaultMutableTreeNode root = new DefaultMutableTreeNode(); root.setAllowsChildren(true); FolderNode rootFolder = new FolderNode(0, "root", "Jiajun", true); root.setUserObject(rootFolder); for(int i=0; i < 5; i++){ DefaultMutableTreeNode newnode = new DefaultMutableTreeNode(); newnode.setAllowsChildren(true); FolderNode newFolder = new FolderNode(i+1, "Folder" + Integer.toString(i+1), "Jiajun", false); newnode.setUserObject(newFolder); root.add(newnode); if(i < 4){ for(int j=0; j < 5; j++){ DefaultMutableTreeNode newdocNode = new DefaultMutableTreeNode(); newdocNode.setAllowsChildren(false); DocNode newDoc = new DocNode(10*(i+1) + j, "Document" + Integer.toString(10*(i+1)+j), "Jiajun"); newdocNode.setUserObject(newDoc); newnode.add(newdocNode); } } } 

谁能帮忙?

为了比我的评论更有帮助,我在AbstractTreeClass中找到了这个代码,它将控制它分配给节点的图像:

 /** * Returns the resource reference for icon of specified tree node. * * @param node * The node * @return The package resource reference */ protected ResourceReference getNodeIcon(TreeNode node) { if (node.isLeaf() == true) { return getItem(); } else { if (isNodeExpanded(node)) { return getFolderOpen(); } else { return getFolderClosed(); } } } 

所以,整个问题是isLeaf()方法返回的问题。 我在DefaultMutableTreeNode类中找到了这个:

 public boolean isLeaf() { return children.size() == 0; } 

因此,似乎您的组合会将没有子项的所有元素视为叶子而不是文件夹。 也许你可以使用getAllowsChildren覆盖getNodeIcon方法,进行必要的类型调整……

另一个想法是覆盖DefaultMutableTreeNode的isLeaf()方法,但如果在无法控制的地方调用它,则可能会遇到其他意外问题…

这只是对如何做到这一点的一些见解…希望它有用…

你使用哪个Wicket版本? 旧的树实现在6.x中已弃用,并在7.x中删除,因此您应该使用org.apache.wicket.extensions.markup.html.repeater.tree包中的新实现 – 它不再基于Swing类。

问题在于if(i < 4){行在外部for循环中。 您允许节点拥有子节点但您不为此最后一个节点创建任何子节点。

编辑:你对空文件夹是正确的,所以我的答案是不正确的。 在Swing中,这可以按预期工作。 渲染树行时,绘制文件夹或文件图标的决定基于标志setAsksAllowsChildren 。 所以问题似乎在Wicket的树组件上

您可以覆盖Folder.getStyleClass以返回所需的Icon。 我有这样的事情:

 @Override protected String getStyleClass() { String styleClass; if (isFolder(getModelObject())) { if (tree.getState(matter) == State.EXPANDED) { styleClass = getOpenStyleClass(); } else { styleClass = getClosedStyleClass(); } } else { styleClass = getOtherStyleClass(matter); } if (isSelected()) { styleClass += " " + getSelectedStyleClass(); } return styleClass; } 

您的isFolder()实现可能会有所不同。