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时,控制哪些列优先保留显示、哪些列被隐藏——优先级数值越小,列越优先显示。它不会改变列的渲染顺序,所以设置后列位置不会变化。
正确调整列顺序的方法
如果要在后台控制列的显示顺序,有两种常用实现方式:
设置列的
order属性
给<p:column>添加order属性,数值越小列越靠前,后台可动态修改该值:((Column) a).setOrder(2); ((Column) b).setOrder(1);注意:建议为所有列设置
order值,未设置的列会按原定义顺序排在已设置列的后面。直接调整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
相关产品推荐
相关产品推荐

