0

我想画一棵在 JSF 中生成的树。

我以为我会使用DynaTree并避免使用组件库,尽管我开始重新考虑解决方案的复杂性。

我想我可以使用隐藏的输入传递树的字符串表示,Javascript然后在那里构建树。

有没有我没有想到的更好的解决方案?

使用JSF2.0

4

2 回答 2

1

我最终所做的是生成一个表示树的 JSON 字符串(以 dynatree 格式),然后在另一端(浏览器)简单地使用 JSON.Parse() 来制作一棵树。

相关代码为:Java树节点:

class GroupTreeNode {
   public getNodes();
   public getGroupId();
   public getName();
}

生成树字符串:

public String generateTreeString()
{
    GroupTreeNode[] root = getGroupTreeBean()
            .getGroupsTreeRoot("groupTree");

    StringBuilder sb = new StringBuilder();

    sb.append("[");

    for (int i = 0; i < root.length; i++)
    {
        genSubTree(root[i], sb);
    }

    sb.append("]");

    return sb.toString();
}

private void genSubTree(GroupTreeNode node, StringBuilder sb)
{
    // Check if the last character is a '}' in which case we need to add a comma
    char[] chararray = new char[1];
    sb.getChars(sb.length()-1, sb.length(), chararray, 0);
    if (chararray[0] == '}') {
        sb.append(", ");
    }

    // Carry on...
    sb.append("{");

    // Group Name
    sb.append("\"title\":\"");
    sb.append(node.getName());
    sb.append("\", ");

    // Group ID (Custom Node Tab)
    sb.append("\"groupID\":\"");
    sb.append(node.getGroupId());
    sb.append("\"");

    // Children (Only if applicable)
    if (node.getNodes().length > 0) {
        sb.append(", \"isFolder\":true, \"children\":[");
        for (int i =0; i < node.getNodes().length; i++)
        {
            genSubTree(node.getNodes()[i], sb);             
        }

        sb.append("]");
    }

    sb.append("}");
}

String 通过 JSF 传入 an<h:inputText id="tree" style="display:none" />然后JavaScript解析:

    function buildTree(sTree) {
        var builtobj = JSON.parse(sTree);
        return builtobj;
    }


    var jsfString = $("#tree").val();
    console.log("Building a tree with:" + jsfString);

    $("#fleet_tab_tree").dynatree({
        onActivate : function (node) {
            console.log("You activated " + node.data.title + ", with groupID=" + node.data.groupID);
            // Do whatever you want with the node values
        },
        persist : true,
        children : buildTree(jsfString),
        clickFolderMode: 1
    });
于 2011-09-01T08:39:46.683 回答
0

我同意你的看法,dynatree 是一个强大且经过验证的组件。与一些功能较少的 JSF 原生树组件相反。

我已经为 dynatree 启动了一个适配器。你可以在这里找到源代码https://github.com/nithril/dynatree-for-jsf

欢迎评论!

于 2012-07-12T22:30:19.510 回答