我有一个带有动态、可拖动和可调整大小的列的 Primefaces 数据表。我需要存储用户对数据表设置的偏好——显示哪些列、它们的顺序和宽度。在支持 bean 中检索显示的列顺序没有问题,但我正在努力解决宽度问题。
<composite:implementation>
<p:commandButton value="Save" update="" id="editMode" action="#{cc.attrs.bean.saveColumnsConfiguration(cc.clientId)}"/>
<p:dataTable id="editTable" widgetVar="editTable" var="entity" value="#{cc.attrs.bean.loadEntities(0)}"
rows="5" resizableColumns="true" draggableColumns="true" lazy="true" >
<c:forEach items="#{cc.attrs.bean.selectedColumns}" var="col">
<p:column width="#{col.width}">
<f:attribute name="property" value="#{col.property}" />
</p:column>
</c:forEach>
</p:dataTable>
</composite:implementation>
在支持 bean 中:
public void saveColumnsConfiguration(String clientId) {
FacesContext currentInstance = FacesContext.getCurrentInstance();
UIComponent findComponent = currentInstance.getViewRoot().findComponent(clientId+":editTable");
DataTable table = (DataTable)findComponent;
List<UIColumn> columns1 = table.getColumns();
for (UIColumn c : columns1) {
System.out.println(currentInstance.getViewRoot().findComponent(c.getClientId()).getAttributes().get("property") +" "+ c.getWidth());
}
}
在 DOM 检查器中,<th/>
元素具有带有 ie 的 style 属性。“宽度:100px”设置为由col
变量提供。但是,在支持 bean 中,所有列的 c.getWidth()=0。我还尝试<p:column style="width: #{col.width}px">
在 bean 中检索它c.getStyle()
,结果是width: 0px
.
我还尝试了 colResize ajax 事件 - 它在 Integer.parseInt 上给了我 NumberFormatExpression,因为该事件正在返回小数点数字。
我需要做的另一件事是设置缩放到用户屏幕的数据表的列宽。我将列大小存储在 % 中,但需要在渲染之前根据屏幕宽度将这些转换为像素大小。如果我以像素为单位设置宽度,浏览器会正确缩放宽度,但是在用户更改列宽时,列会跳转到它们的实际像素大小,这会弄乱整个表格。知道怎么做吗?