2014-11-06 26 views
6

'da görünmüyor Özel bir eylem gerçekleştirmek için bir ağaçta contextMenu eklemeye çalışıyorum. Bu ağaç bir overlaypanel içinde uygulanır. Gözlemlediğim şey, contextMenu'nun sadece ağaçtaki bazı öğeleri seçip seçtikten sonra olduğu gibi rastgele durumlarda ortaya çıkmasıdır. Herhangi bir fikir?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 biçimli

<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

Lütfen bir çok bilgiyi açıklayın. ContextMenu seçildiğinde, ağacı değiştirmek ister misiniz? – wittakarn

+0

Neden sessizsiniz, kod çalışıyor? – 0x5a4d

+0

Hayır, kodunuzu deneyin ama onContextMenu işlevine asla ulaşılamıyor. – tech4

cevap

3

böyle deneyin:

benim 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> 

Ve fasulye:

@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; 
    } 
} 

Yöntem selectionRecursive (TreeNode düğüm) hata ayıklama gerek ama benim durumumda tüm çalışmaları harika.

1

Ben gerçekten ne elde etmek istediğinizi hakkında emin değilim ama: Sen ağaç bileşeninin 2 özelliklerini kullanıyor

.

  • Onay Kutusu (çoklu) seçimi
  • düğümlerde Bağlam menüsü aynı anda her iki özelliğin

kullanın şu anda Primefaces bt desteklenmemektedir. Bir düğümü her sağ tıklattığınızda, contextMenu görünür, ardından düğüm seçilir/seçilmez. Bir düğümün dışını tıklatırsanız contextMenu görünmez (kapsayıcı arka plan veya düğümler arasında)

Tüm ağaç için tek bir contextMenu istiyorsanız (örneğin Tümünü Seç, Tüm Seçimleri Kaldır, Her neyi seçin ...) için nitelik contextMenu tarih:

yerine:

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

sadece yazma

<p:contextMenu id="contextSearch"> 

Bu şekilde, contextMenu konteynerin üzerine sağ tıklattığınız her yerde görünür (kasanızdaki p:column).

+0

Evet, iki özelliği düğümde gerçekleştirilmesini istiyorum. Onay kutusu, her seviyedeki düğümleri seçer, ancak çocuklara değil. ContextMenu, düğümü ve çocuklarını seçmektir. Ne yapacağını söylüyorum ama hiçbir şey olmaz: – tech4