Java DefaultTreeModel和Wicket树:setAsksAllowsChildren不';行不通

Java DefaultTreeModel和Wicket树:setAsksAllowsChildren不';行不通,java,swing,wicket,jtree,Java,Swing,Wicket,Jtree,我正在web应用程序中使用Wicket的树组件。但空文件夹以文件方式显示。 就这样, 下面是我使用DefaultTreeModel和Tree的地方: PDMinterface pdmI = new PDMinterface(); DefaultMutabletreeNode rootTreeNode = pdmI.getDocTree(); //文档树根结点,由PDM接口提供 DefaultTreeModel treeModel = new DefaultTreeMod

我正在web应用程序中使用Wicket的树组件。但空文件夹以文件方式显示。 就这样,

下面是我使用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);
            }
        }
    }
public DefaultMutableTreeNode getDocTree(){
DefaultMutableTreeNode根=新的DefaultMutableTreeNode();
root.setAllowsChildren(true);
FolderNode rootFolder=新FolderNode(0,“根”,“佳骏”,真);
setUserObject(根文件夹);
对于(int i=0;i<5;i++){
DefaultMutableTreeNode newnode=新的DefaultMutableTreeNode();
newnode.setAllowsChildren(true);
FolderNode newFolder=新FolderNode(i+1,“Folder”+Integer.toString(i+1),“Jiajun”,false);
setUserObject(newFolder);
添加(newnode);
if(i<4){
对于(int j=0;j<5;j++){
DefaultMutableTreeNode newdocNode=新的DefaultMutableTreeNode();
newdocNode.setAllowsChildren(false);
DocNode newDoc=newdocnode(10*(i+1)+j,“Document”+Integer.toString(10*(i+1)+j),“Jiajun”);
setUserObject(newDoc);
添加(newdocNode);
}
}
}

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


编辑:你对空文件夹的看法是正确的,所以我的答案是不正确的。在Swing中,这与预期一样有效。当呈现树行时,绘制文件夹或文件图标的决定基于标志
setasksallowschilds
。因此问题似乎出在Wicket的树组件上问题在于行
if(i<4){
在循环的外部
中。允许节点有子节点,但不为最后一个节点创建任何子节点


编辑:您对空文件夹的看法是正确的,因此我的答案是错误的。在Swing中,这一点与预期的一样有效。当呈现树行时,绘制文件夹或文件图标的决定基于标志
setasksallowschilds
。因此问题似乎出在Wicket的树组件上,这比我的注释中更有用,我发现是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()方法,但是如果在无法控制的地方调用它,则可能会遇到其他意外问题


这只是一些关于如何做到这一点的见解…希望有帮助…

要比我的评论更有帮助,我在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类。

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

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

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

是的,它是一个文件夹,但是空的,空文件夹应该看起来像文件夹而不是文件。@Friedmann您是对的。我已经更新了我的答案,指出它不正确。在Swing中,这一点与预期一样有效。也许您应该在问题中添加您使用的版本以及与相关组件初始化相关的任何代码s为了增加有人帮助你的可能性我想这可能是wicket的
的问题。我刚刚在Swing中做了一个实验,效果很好。现在我只是想知道
的替代方案在哪里,因为它已被弃用。是的,它是一个文件夹,但它是空的,空文件夹应该看起来像一个文件夹,而不是一个file.@Friedmann你是对的。我已经更新了我的答案,说它不正确。在Swing中,这是预期的效果。也许你应该在你的问题中添加你使用的版本和任何与相关组件初始化相关的代码,以增加有人帮助你的可能性。我想可能是wicket的
问题。我刚刚在Swing中做了一个实验,效果很好。现在我只是想知道
树的替代方案在哪里,因为它已经被弃用了。这听起来有点奇怪,但我经常不得不扩展一些wicket组件并调整它们的代码,以便它完全符合我的需要。您尝试过吗