2014-11-06 5 views
6

Ich versuche, ein ContextMenu in einer Struktur hinzuzufügen, um eine benutzerdefinierte Aktion durchzuführen. Dieser Baum ist in einem Overlay-Panel implementiert. Was ich beobachtet habe, ist, dass das contextMenu nur in zufälligen Situationen erscheint, wie nach dem Auswählen und Entfernen von Elementen in der Baumstruktur. Irgendeine Idee?Primefaces: ContextMenu erscheint nicht in 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> 

Advancedform

<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

Bitte erläutern Sie viele Informationen. Möchtest du den Baum wechseln, wenn contextMenu ausgewählt wurde? – wittakarn

+0

Warum bist du still, der Code funktioniert? – 0x5a4d

+0

Nein, ich versuche Ihren Code, aber die Funktion onContextMenu wird nie erreicht. – tech4

Antwort

3

wie das Versuchen:

meine Advanced-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> 

Und meine Bohne:

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

Methode selectionRecursive (TreeNode node) debug müssen aber in meinem Fall alle Arbeiten groß.

1

Ich bin mir nicht sicher, was Sie wirklich erreichen wollen, aber:

Sie verwenden 2 Merkmale der Baumkomponente.

  • Kästchen zum Ankreuzen (Mehrfach-) Auswahl
  • Kontextmenü auf Knoten

Nutzung beiden Funktionen zur gleichen Zeit wird derzeit nicht bt Primefaces unterstützt. Wenn Sie mit der rechten Maustaste auf einen Knoten klicken, wird ContextMenu angezeigt, und der Knoten wird ausgewählt/abgewählt. Das contextMenu wird nicht angezeigt, wenn Sie außerhalb eines Knotens klicken (Containerhintergrund oder zwischen Knoten)

Wenn Sie ein einzelnes contextMenu für den gesamten Baum wünschen (dh Alles auswählen, Alles abwählen, Alles auswählen ...), entfernen Sie es einfach die für Attribut auf contextMenu:

statt:

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

nur schreiben

<p:contextMenu id="contextSearch"> 

Auf diese Weise erscheint das contextMenu wo immer Sie mit der rechten Maustaste auf den Container klicken (p:column in Ihrem Fall).

+0

Ja, ich möchte die zwei Funktionen auf dem Knoten ausgeführt werden. Das Kontrollkästchen dient zum Auswählen von Knoten auf allen Ebenen, nicht jedoch der untergeordneten Elemente. Das contextMenu soll den Knoten und seine Kinder auswählen. Ich versuche, was du gesagt hast, aber nichts passiert: / – tech4