1

我在 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);
            }
        }
    }
4

4 回答 4

2

为了比我的评论更有帮助,我在 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() 方法,但是如果在您无法控制的地方调用它,您可能会遇到其他意想不到的问题......

这只是有关如何做到这一点的一些见解...希望对您有所帮助...

于 2013-07-23T14:20:31.063 回答
2

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

于 2013-07-24T07:14:25.793 回答
0

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

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

于 2013-07-23T11:57:48.890 回答
0

您可以覆盖 Folder.getStyleClass 以返回所需的图标。我得到了这样的东西:

@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() 的实现可能会有所不同。

于 2014-09-16T14:38:52.720 回答