Как создать p:treeNode с произвольными компонентами на основе объектов данных произвольного узла

Предположим, у меня есть класс DataObj

public class DataObj implements Serializable {
  private Set<String> values;
  private String name;

  // default constructor, constructor to pass properties

  // getter and setter
}

и установить экземпляр как свойство данных TreeNode:

@ManagedBean
public ACtrl extends Serializable {
  private TreeNode root = new DefaultTreeNode(new DataObj(new HashSet<>(Arrays.asList("a","b")), "some name"));

  // default constructor

  // getter for root
}

Как я могу создать динамический p:treeNodes, которые содержат компоненты на основе свойства данных (и его содержимого), например, флажок для каждой строки в DataObj.values?

В следующем примере показано, как изменить содержимое в зависимости от типа или значения TreeNode.data, но c:if а также c:forEach не работают (я уверен, что они не должны, потому что узел должен быть null когда они оценены):

<ui:composition 
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets" 
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:p="http://primefaces.org/ui"  >
  <h:form id="form">
    <p:tree id="tree" value="#{aCtrl.root}" var="node" >
      <p:treeNode id="treeNode">
        <h:outputText value="#{node.name}"/>
        <p:spinner value="#{node}" rendered="#{node.getClass().getName() eq 'java.lang.Integer'}"/>
        <c:if test="#{node.getClass().getName() eq 'DataObj'}">
          <c:forEach items="#{node.values}" var="value">
            <h:selectBooleanCheckbox value="#{value}"/>
            <h:outputText value="#{value.name}"/>
          </c:forEach>
        </c:if>
      </p:treeNode>
    </p:tree>  
  </h:form>  
</ui:composition>

Пожалуйста, рассмотрите этот псевдокод... Я знаю, что он не запускается и не компилируется, но он облегчает объяснение моей проблемы и, возможно, ответы:)

Существуют ли альтернативные библиотеки компонентов JSF или расширения для решения этой проблемы?

1 ответ

Использование ui:repeat необходимо (пробовал это раньше, но не обращал внимания на тот факт, что value должен быть "Список, массив, java.sql.ResultSet или отдельный объект Java", но не набор ключей ключей карты:) - необходимо добавить .toArray() в этом случае).

...
<p:treeNode id="treeNode" >
  <ui:repeat var="key" value="#{node.type.aValue.keySet().toArray()}">  
    <h:selectBooleanCheckbox id="checkbox" value="#{node.type.aValue.get(key)}"/>
    <h:outputLabel for="checkbox" value="#{key}"/>
  </ui:repeat>  
</p:treeNode>
...

где node.type.aValue это Map<String,Boolean>,

Полезное:

Другие вопросы по тегам