Primefaces DataTable 的特定于列的上下文菜单

Posted

技术标签:

【中文标题】Primefaces DataTable 的特定于列的上下文菜单【英文标题】:Column-specific context menu for Primefaces DataTable 【发布时间】:2013-01-16 02:22:03 【问题描述】:

如何在 Primefaces 数据表中为每一列定义不同的上下文菜单?将<p:contextMenu> 放入<p:column> 无法正常工作。我希望上下文菜单根据用户右键单击的列而有所不同。

这不起作用(为所有列创建相同的上下文菜单):

<p:dataTable value="#values" var="value" selectionMode="single" selection="#selectedValue" id="table">
    <p:column headerText="Col 1">
        <h:outputText value="#value.balance">
            <f:convertNumber type="currency"></f:convertNumber>
        </h:outputText>
        <p:contextMenu>
            <p:menuitem value="Report"></p:menuitem>
            <p:menuitem value="Change"></p:menuitem>
        </p:contextMenu>
    </p:column>
    <p:column headerText="col 2" >
        <h:outputText value="#value.balance2">
            <f:convertNumber type="currency"></f:convertNumber>
        </h:outputText>
    <p:contextMenu>
        <p:menuitem value="Something else"></p:menuitem>
    </p:contextMenu>
    </p:column>
</p:dataTable>

如何通过使用 PF 组件、扩展 PF 组件或添加自定义 javascript 在 Primefaces dataTable 中添加特定于列的上下文菜单?

【问题讨论】:

你有没有想过这个问题? 还没有。我现在正忙于其他任务,所以我要过几天才能尝试@kian 的解决方案 【参考方案1】:

你试过了吗(我刚刚用 Primefaces 3.5 测试过): ContextMenu 可以附加到任何 JSF 组件,primefaces 数据表中的每一行都有私有和动态 id(例如::carList:0:test1 :carList:1:test1 ...),所以我认为你应该在列内使用 contextMenu:

                 <p:column headerText="Model">  
                    <p:panel id="test1">
                        <h:outputText value="#carr.model" />
                        <p:contextMenu for="test1" widgetVar="cMenu">
                            <p:menuitem value="Edit Cell" icon="ui-icon-search"
                                        onclick="product.showCellEditor();return false;" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu.hide()" />
                        </p:contextMenu>
                    </p:panel>
                </p:column>  
                <p:column headerText="MANUFAC" style="width:20%">  
                    <p:panel id="test2">
                        <h:outputText value="#carr.manufacturer" />
                        <p:contextMenu for="test2" widgetVar="cMenu2">
                            <p:menuitem value="Edit Cell" icon="ui-icon-search"
                                        onclick="product.showCellEditor();return false;" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu2.hide()" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu2.hide()" />
                        </p:contextMenu>
                    </p:panel>
                </p:column>

如果要指定行:

<p:column headerText="Model" style="width:30%">  
                    <p:panel id="test1">
                        <h:outputText value="#carr.model" />
                        <p:contextMenu rendered="#carr.model eq 'SENT'" for="test1" widgetVar="cMenu">
                            <p:menuitem value="Edit Cell" icon="ui-icon-search"
                                        onclick="product.showCellEditor();return false;" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu.hide()" />
                        </p:contextMenu>
                        <p:contextMenu rendered="#carr.model eq 'WAITING'" for="test1" widgetVar="cMenu3">

                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu3.hide()" />
                        </p:contextMenu>
                    </p:panel>
                </p:column>  

【讨论】:

不,这不起作用。这只是为每列放置一个特定的上下文菜单。根本不是我想要的。 天哪。抱歉,RongNK - 我是个白痴。我发现这个问题甚至不是我的问题。 哦,这很有趣,什么都没有:) 这是我的问题,被一个白痴 *** 成员错误地关闭为这个问题的副本:***.com/questions/16099698/… 帮我回答,50+ 是你的。 对我来说,名声不重要,我已经测试过了,它对我来说很好,我只是想帮助其他人!【参考方案2】:

另一种方法是使用 p:menuButton。 p:menuButton 可以更改为看起来像 p:contextMenu 都是关于 styleClass 的。

    创建自定义样式类以更改向下箭头

    .contextButton .ui-state-default .ui-icon
        background:url(YOUR_IMAGE_PATH);
    
    

    创建自定义样式类来隐藏按钮边框和背景

    .contextButton .ui-button 边框:无;背景:无;

    .contextButton .ui-button.ui-state-hover, .ui-button.ui-state-focus, .ui-button.ui-state-active 边框:无;背景:无;

    在 p:menuButton 中使用自定义 styleClass

    P:这里的菜单项

您可以参考here 的工作示例

【讨论】:

我喜欢这个想法——这可能是我在这里需要的最接近的近似值。通过一些调整,还应该可以在右键单击时触发菜单按钮,从而模拟上下文菜单。会试试这个并恢复 我也认为这是唯一的解决方案。【参考方案3】:

可选的属性定义 contextMenu 附加到哪个组件。未定义for时,contextMenu附加到页面含义,在页面任意位置右击会显示菜单。

这就是Primefaces Documentation 所说的contextMenu 标签。因此,按照您的方式,它附加到页面含义。使用 for 属性,您将能够与 Primefaces 组件集成,但可能无法与特定的表格列集成。

另外Datatable 文档建议您只能在对表格进行选择时这样做,因为它似乎有特殊的方法可以使其适应树节点

不过,我强烈建议您在询问之前先查看文档。

【讨论】:

我也尝试过“for”属性 - 应该在原始问题中提到。通常,您可以将“for”属性替换为将组件放置在目标组件内。无论如何,这会导致错误 java.lang.ClassCastException: org.primefaces.component.column.Column cannot be cast to org.primefaces.component.api.Widget。不过,应该可以使用自定义 Javascript 代码将上下文菜单附加到特定列...

以上是关于Primefaces DataTable 的特定于列的上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

Primefaces:从p:dataTable中的行选择中排除列

Primefaces dataTable过滤日期

使用带有Primefaces DynaForms的dataTable

特定版本为 False 时的特定于版本的程序集引用

默认的特定于用户的属性

我的服务器设置正确的特定于语言环境的时区是不是重要? [复制]