【问题标题】:RichFaces rich:tree nodeFace type not assignedRichFaces rich:tree nodeFace 类型未分配
【发布时间】:2010-02-12 15:35:12
【问题描述】:

我的 JSF 中有一个 rich:tree,如下所示:

            <rich:tree value="#{MyBacking.treeNodes}" var="item"
                nodeFace="#{item.type}">
                <rich:treeNode type="folder"
                    <h:outputText value="#{item.folder}" />
                </rich:treeNode>
                <rich:treeNode type="file"
                    <h:outputText value="#{item.contfile}" />
                </rich:treeNode>
            </rich:tree>

还有 java 运行时错误

'#{item.type}' Property 'type' not found on type java.lang.String

但是我查看了org.richfaces.model.TreeNodeImpl 的javadoc,并没有提到将类型分配给树节点的方法。这是怎么做到的?

编辑 我已根据提供的答案修改了代码。虽然感觉不错,但我的树现在被忽略了。 java看起来像这样:

在我的支持 bean (MyBacking) 中:

public TreeNodeImpl<LogTreeItem> getTreeNodes() {
    TreeNodeImpl<LogTreeItem> rootNode = new TreeNodeImpl<LogTreeItem>();
    LogTreeItem rootItem = new LogTreeItem();
    rootItem.setType("folder");
    rootItem.setName("folderName");
    rootNode.setData(rootItem);

    return rootNode;
}

物品类别:

public class LogTreeItem {
    private String type; 
    private String name; 

    public String getType() {
        return type;
    }

    public void setType(String t) {
        type = t;
    }

    public String getName() {
        return name;
    }

    public void setName(String n) {
        name = n;
    }
}

JSF sn-p 现在是这样的:

            <rich:tree value="#{MyBacking.treeNodes}" var="item" nodeFace="#{item.type}">
                <rich:treeNode type="folder">
                    <h:outputText value="#{item.name}" />
                </rich:treeNode>
            </rich:tree>

我现在要做的就是让一棵树被识别出来。因为我只创建一个带有 rootNode 的树,所以我期待一个节点树输出,但我什么也没看到。我知道我已经很接近了,但我只是看不出有什么调整可以让它栩栩如生。

非常感谢

【问题讨论】:

    标签: java jsf richfaces


    【解决方案1】:

    您的item 似乎是String 类型。 nodeFace 属性确定将为每个item 呈现下面定义的节点之一。

    您必须使用包含自定义类型数据的节点来填充树。假设您的 item 如下所示:

    public class Item {
        private String type; //getter+setter
        private String folder; //getter+setter
        private String contfile; //getter+setter
    }
    

    那么treeNodes实际上应该是rootNode,并且必须是这样的:

    rootNode = new TreeNodeImpl<Item>();
    for (some loop here) {
        TreeNode<Item> node = new TreeNodeImpl<Item>();
        Item item = ..; //get or create the item;
        node.setData(item);
        node.setParent(rootNode);
        rootNode.addChild("someIdentifier", node);
    }
    

    我建议查看richfaces demo sources 以了解它是如何在那里实现的。

    【讨论】:

    • 感谢您的好建议 - 我认为这是正确的,但我已根据您的回答修改了我的问题以包含代码,因为它不太有效。你能建议为什么这段代码不输出一棵树吗?
    • @Mark Lewis:是的,我忘了rootNode.addChild(..); :)
    • 谢谢。有趣的是,在行中添加“1”作为标识符,rootItem 作为我要添加的节点,导致 eclipse 呻吟,The method addChild(Object, TreeNode&lt;LogTreeItem&gt;) in the type TreeNodeImpl&lt;LogTreeItem&gt; is not applicable for the arguments (String, LogTreeItem);我的选择之一是让LogTreeItem 实现TreeNode;然后我必须允许它将未实现的方法添加到LogTreeItem 才能构建它。这听起来对你吗?它有效,但似乎有点极端。
    • 我刚刚注意到 jsf 引用 #{item.name} 没有选择根节点的名称。听起来我还是有点不对劲。我的标识符应该是什么? javadoc 说的是一个对象,但我去过的所有网站都使用整数。
    • 该标识符是您正在使用的对象的唯一标识符,您以后可以使用它来获取原始对象。
    猜你喜欢
    • 2011-01-20
    • 2015-03-18
    • 2016-02-04
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2021-07-02
    • 2020-11-02
    • 2021-08-30
    相关资源
    最近更新 更多