Основные возможности 4: управление выбранным узлом и контекстным меню в одном и том же дереве

#primefaces #contextmenu #jsf-2.2

#основные области #контекстное меню #jsf-2.2

Вопрос:

помогите мне, пожалуйста!!!
На моей странице у меня есть две части:

  • часть «меню», где я использую TreeNode в качестве выбора.
  • вторая часть «центральная», где я показываю страницу каждый раз, когда выбирается узел.

Просто все работает гладко.
Проблемы начались, когда я связал TreeNode с ContextMenu. Каждый раз, когда я щелкаю правой кнопкой мыши на узле, чтобы просмотреть мое контекстное меню, оно показывает время загрузки моей центральной страницы. Похоже, что щелкните правой кнопкой мыши и выберите neoud в замешательстве, и тот, кто возьмет на себя управление, выберет узел.
Возможно ли разделить эти два события?
Возможно ли поступить иначе или есть обходной путь?
Найденный мной обходной путь заключается в размещении командной ссылки под каждым узлом. это не сработало, особенно для дочерних узлов.
Спасибо за вашу помощь

 <h:form id="formMenuAdmin" >
    <p:panel header="Domaines" id="panelDomaines" style="border: none;width: auto" >
        <p:contextMenu for="treeMenuAdmin" id="contextMenuTreeNodeDomaine" nodeType="Domaine">
            <p:menuitem id="menuitemAdd" value="Créer " icon="ui-icon-search" actionListener="#{domaineCtrl.afficherDialogOrg('dialogCreateDgdsVar')}">
            </p:menuitem>                                
            <p:menuitem id="menuitemEdit" value="Editer" icon="ui-icon-search">
            </p:menuitem>
            <p:menuitem id="menuitemUpdate" value="Modifier" icon="ui-icon-search">
            </p:menuitem>

            <p:menuitem id="menuitemDelete" value="Supprimer" icon="ui-icon-search">
            </p:menuitem>                            
        </p:contextMenu>                            
        <p:contextMenu for="treeMenuAdmin" id="contextMenuTreeNodeSousDomaine" nodeType="Dss">
            <p:menuitem id="menuitemAddDss" value="Créer" 
                                        icon="ui-icon-search" 
                                        actionListener="#{domaineCtrl.afficherDialogOrg('dialogCreateDss')}">
            </p:menuitem>

            <p:menuitem id="menuitemEditDss" value="Editer"
                                        icon="ui-icon-search" actionListener="#">
            </p:menuitem>
            <p:menuitem id="menuitemUpdateDss" value="Modifier "
                                        icon="ui-icon-search" actionListener="#">
            </p:menuitem>
            <p:menuitem id="menuitemDeleteDss" value="Supprimer"
                                        icon="ui-icon-search" actionListener="#">
            </p:menuitem>

        </p:contextMenu>
        <p:tree id="treeMenuAdmin" value="#{treeNodeCtrl.rootTreeNode}" 
                                var="doc" selectionMode="single" 
                                selection="#{treeNodeCtrl.selectedTreeNode}" 
                                style="width: auto;border: none" cache="true" >


            <p:ajax event="select" listener="#{treeNodeCtrl.onNodeSelect()}"  />

            <p:treeNode id="treeNodeDomaine" type="Domaine"
                                        expandedIcon="ui-icon-folder-open" 
                                        collapsedIcon="ui-icon-folder-collapsed"> 
                <h:outputText value="#{doc.nom}" id="outputTextDomaine#{doc}"/>                                    
            </p:treeNode>

            <p:treeNode id="treeNodeDss" type="Dss"  >
                <h:outputText value="#{doc.nom}" id="outputTextDss"  />                                                 
            </p:treeNode>                                

        </p:tree>
    </p:panel>

</h:form>
  

Комментарии:

1. Можете ли вы показать нам контекстное меню для «центральной» части?

2. @rion18, у меня нет никакого контекстного меню на центральной странице. Я думаю, что я плохо объяснил проблему: центральная страница просто отображает содержимое выбранного узла (узел, выбранный в меню страницы).

3. Хорошо, я понял. Когда вы щелкаете правой кнопкой мыши узел, чтобы вызвать контекстное меню, затем этот узел выбирается, это поведение PrimeFaces по умолчанию. Однако в версии PF 5.0 (начиная с версии PF 4.0.2) SelectTreeNodeEvent был обновлен и включен isContextMenu() метод. Вы можете увидеть это здесь . Возможен ли переход на PF 5.0?

4. Да, я могу. Итак, решение состоит в том, чтобы просто переключиться на PF5.0? Ничего не меняя в моем коде, если я вас понимаю.

Ответ №1:

Переключение на PF 5.0 позволит вам использовать isContextMenu метод. Единственное отличие, которое это повлечет за собой, заключается в следующем, в вашем onNodeSelect методе.

 public void onNodeSelect(NodeSelectEvent event){
  if (!event.isContextMenu()){
    //original code here.
  }
}
  

Таким образом, ваш исходный код выбора будет выполнен, если контекстное меню НЕ вызвано.

Комментарии:

1. неплохо. не знал, что здесь есть этот метод. 😀 спасибо!