You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Primefaces dataTable displayPriority参数无法调整列顺序问题

问题

尝试使用displayPriority参数调整PrimeFaces DataTable的列顺序,但操作未生效。修改列的isVisible或width参数时均能正常生效,为何displayPriority参数无法起作用?

XHTML代码

<p:dataTable id="dataTableIncomingDoc"
             var="item"
             scrollable="true"
             scrollHeight="100%"
             scrollWidth="100%"
             showGridlines="true"
             selectionMode="single"
             draggableColumns="true"
             resizableColumns="true"
             size="small"
             styleClass="fixed-size"
             selection="#{docsBean.docEntitySelected}"
             rowKey="#{item.id}"
             value="#{docsBean.loadDocsList()}">

    <p:column id="registrationDate"
              headerText="Reg. date"
              width="100"
              filterBy="#{item.registrationDate}"
              sortBy="#{item.registrationDate}"
              filterMatchMode="contains">
        <h:outputText value="#{item.registrationDate}"/>
    </p:column>

    <p:column id="regNr"
              headerText="Reg. Nr."
              width="100"
              filterMatchMode="contains"
              sortBy="#{item.regNr}"
              filterBy="#{item.regNr}">
        <h:outputText value="#{item.regNr}"/>
    </p:column>

    <p:column id="documentNr"
              headerText="Doc. Nr."
              width="100"
              filterMatchMode="contains"
              sortBy="#{item.docNr}"
              filterBy="#{item.docNr}">
        <h:outputText value="#{item.docNr}"/>
    </p:column>
</p:dataTable>

Java Bean代码

public List<DocEntity> loadDocsList() {

    var dataTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("mainForm:dataTableIncomingDoc");

    var a = dataTable.getColumns().get(1);
    var b = dataTable.getColumns().get(2);

    ((Column) a).setDisplayPriority(2);
    ((Column) b).setDisplayPriority(1);

    PrimeFaces.current().ajax().update(dataTable);

    return docsList;
}
原因及解决方案

原因:误解了displayPriority的作用

displayPriority并非用于调整列的显示顺序,它的核心用途是:当DataTable开启scrollable="true"(你的表格已开启该属性),且所有列总宽度超出表格scrollWidth时,控制哪些列优先保留显示、哪些列被隐藏——优先级数值越小,列越优先显示。它不会改变列的渲染顺序,所以设置后列位置不会变化。

正确调整列顺序的方法

如果要在后台控制列的显示顺序,有两种常用实现方式:

  1. 设置列的order属性
    给<p:column>添加order属性,数值越小列越靠前,后台可动态修改该值:

    ((Column) a).setOrder(2);
    ((Column) b).setOrder(1);
    

    注意:建议为所有列设置order值,未设置的列会按原定义顺序排在已设置列的后面。

  2. 直接调整DataTable的列列表顺序
    获取表格的列集合后,重新调整列的位置:

    List<UIColumn> columns = dataTable.getColumns();
    // 移除目标列
    UIColumn regNrCol = columns.remove(1);
    UIColumn docNrCol = columns.remove(1); // 移除后原索引2的列变为索引1
    // 插入到目标位置
    columns.add(1, docNrCol);
    columns.add(2, regNrCol);
    

额外注意点

你在loadDocsList()中操作组件的时机存在风险:该方法作为表格的数据源方法,会在组件渲染阶段前被调用,此时组件可能未完全初始化。建议把列顺序调整逻辑放到@PostConstruct方法,或者用户触发的Action方法(如按钮点击事件)中,而非数据加载方法内。

内容的提问来源于stack exchange,提问作者Pegus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:56:13