2014-11-06 2 views
6

트리에 contextMenu를 추가하여 사용자 지정 작업을 수행하려고합니다. 이 트리는 오버레이 패널 안에 구현됩니다. 내가 관찰 한 것은 contextMenu가 트리의 일부 요소를 선택하거나 선택 취소 한 후 임의의 상황에서만 표시된다는 것입니다. 어떤 아이디어?Primefaces : ContextMenu가 overlayPanel에 표시되지 않습니다.

<p:overlayPanel id="advancedSearchPanel" 
    styleClass="ui-advanced-search-overlay" 
    for="advancedSearch" 
    hideEffect="fade" 
    my="right top" 
    widgetVar="advancedSearchPanelWidgetVar" > 
     <ui:include src="/search/advancedSearch-form.xhtml"/> 
</p:overlayPanel> 

에서 AdvancedSearch 형태

<p:panelGrid id="panelAdvanced" styleClass="borderless"> 
... 
    <p:row> 
     <p:column colspan="4"> 
      <p:outputLabel value="#{text['searchForm.classifiers']}" for="treeClassifier" styleClass="paddingLabelGrid"/> 

      <p:contextMenu id="contextSearch" for="treeClassifier"> 
       <p:menuitem value="Escolha todos" update=":searchForm:treeClassifier" actionListener="#{navBarController.displaySelectedSingle}"/> 
      </p:contextMenu> 

      <p:tree id="treeClassifier" 
       value="#{navBarController.rootClassifier}" 
       var="node" selectionMode="checkbox" 
       selection="#{navBarController.selectedClassifiers}" 
       style="height: 200px;width: 540px; margin-bottom: 0px; overflow: auto" 
       propagateSelectionDown="false" 
       propagateSelectionUp="false"> 

        <p:ajax event="select" update=":searchForm:btnSearch"/> 
        <p:ajax event="unselect" update=":searchForm:btnSearch"/>  

        <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed"> 
         <h:outputText value="#{node.description}(#{node.code})"/> 
        </p:treeNode> 
      </p:tree> 
     </p:column> 
    </p:row> 
... 
+0

많은 정보를 설명해주십시오. contextMenu가 선택 될 때마다 트리를 변경 하시겠습니까? – wittakarn

+0

코드가 작동하는 이유는 무엇입니까? – 0x5a4d

+0

아니요, 귀하의 코드를 시도하지만 onContextMenu 함수에 절대로 도달하지 못했습니다. – tech4

답변

3

그런 시도 :

내에서 AdvancedSearch-form.xhtml

<?xml version="1.0" encoding="UTF-8" ?> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:c="http://java.sun.com/jsp/jstl/core" 
       xmlns:p="http://primefaces.org/ui">  

<h:form id="searchForm"> 
    <p:panelGrid id="panelAdvanced" styleClass="borderless"> 
     <p:row> 
      <p:column colspan="4"> 
       <p:contextMenu id="contextSearch" for="treeClassifier"> 
           <p:menuitem value="Escolha todos" update="treeClassifier" actionListener="#{treeView.displaySelectedSingle}"/> 
       </p:contextMenu> 
       <p:tree id="treeClassifier" value="#{treeView.root}" var="node" selectionMode="checkbox" selection="#{treeView.selectedClassifiers}" 
          style="height: 200px;width: 540px; margin-bottom: 0px; overflow: auto" 
          propagateSelectionDown="false" 
          propagateSelectionUp="false"> 
           <p:ajax event="select" global="false" listener="#{treeView.reset}" /> 
           <p:ajax event="unselect" global="false" listener="#{treeView.reset}" />  
           <p:ajax event="contextMenu" global="false" listener="#{treeView.onContextMenu}"/>  
           <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed"> 
            <h:outputText value="#{node.nodeName}"/> 
           </p:treeNode> 
       </p:tree> 
      </p:column> 
     </p:row> 
     </p:panelGrid> 
</h:form>   
</ui:composition> 

그리고 내 콩 :

@Component(value="treeView") 
@Scope(value = "session") 
public class TreeView implements Serializable { 

    private TreeNode[] selectedClassifiers; 

    public TreeNode[] getSelectedClassifiers() { 
     return selectedClassifiers; 
    } 

    public void setSelectedClassifiers(TreeNode[] selectedClassifiers) { 
     this.selectedClassifiers = selectedClassifiers; 
    } 

    private TreeNode selectedClassifier; 

    public void reset(){ 
     selectedClassifier = null; 
    } 

    public void displaySelectedSingle(){ 
     if(selectedClassifier != null){ 
      List<TreeNode> selected = new ArrayList<TreeNode>(); 
      for(int i=0; i < selectedClassifiers.length; i++){ 
       selected.add(selectedClassifiers[i]); 
       if(selectedClassifiers[i].equals(selectedClassifier)) 
        selected.addAll(selectionRecursive(selectedClassifier)); 
      } 
      selectedClassifiers = selected.toArray(new TreeNode[selected.size()]); 
     } 

    } 

    public void onContextMenu(NodeSelectEvent event){ 
    selectedClassifier = event.getTreeNode(); 
    } 

    public List<TreeNode> selectionRecursive(TreeNode node){ 

     List<TreeNode> selected = node.getChildren(); 

     for(TreeNode child : node.getChildren()){ 
      selected.addAll(selectionRecursive(child)); 
      child.setSelected(true); 
     } 

     return selected; 
    } 
} 

방법 selectionRecursive (TreeNode를 노드) 디버깅을 필요로하지만, 내 경우에는 모든 작업을 큰.

1

나는 당신이 정말로 달성하고자하는 일에 대해 잘 모르겠지만, : 당신은 트리 구성 요소의이 기능을 사용하는

.

  • 확인란 (여러) 선택
  • 노드의 컨텍스트 메뉴 는 동시에 두 기능의

사용은 현재 Primefaces BT는 지원되지 않습니다. 노드를 마우스 오른쪽 버튼으로 클릭 할 때마다 contextMenu가 표시되고 노드가 선택/선택 해제됩니다. 노드 외부 (컨테이너 배경 또는 노드 사이)를 클릭하면 contextMenu가 표시되지 않습니다.

전체 트리에 대해 하나의 contextMenu (예 : 모두 선택, 모두 선택 취소, 선택 ...) 에 대한 속성 contextMenu를 에 :

대신 :

<p:contextMenu id="contextSearch" for="treeClassifier"> 

단지 쓰기

<p:contextMenu id="contextSearch"> 

이렇게하면 contextMenu이 컨테이너 (어디서나 p:column)를 마우스 오른쪽 버튼으로 클릭 할 때마다 나타납니다.

+0

예, 노드에서 수행 된 두 가지 기능을 원합니다. 체크 박스는 모든 레벨에서 노드를 선택하지만 자식은 선택하지 않습니다. contextMenu는 노드와 그 자식을 선택하는 것입니다. 나는 네가 한 것을 시도하지만 아무 일도 일어나지 않는다. / – tech4

관련 문제