DefaultTreeModel和Wicket Tree:setAsksAllowsChildren不起作用

时间:2013-07-23 11:52:30

标签: java swing wicket jtree

我在网络应用中使用Wicket的Tree组件。但是空文件夹以文件方式显示。 像这样: enter image description here

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您可以覆盖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()实现可能会有所不同。