我有一个Primefaces DataTable,包含动态,可拖动和可调整大小的列。我需要存储用户对数据表设置的偏好 - 显示哪些列,它们的顺序和宽度。 检索辅助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。由col
变量提供的“width:100px”设置。但是,在backing bean中,所有列都有c.getWidth()= 0。我还尝试<p:column style="width: #{col.width}px">
并在c.getStyle()
的bean中检索它,结果为width: 0px
。
我也尝试过colResize ajax事件 - 它在Integer.parseInt上给我NumberFormatExpression,因为事件返回小数点数。
我需要做的另一件事是将数据表的列宽设置为用户屏幕。我将列大小存储在%中,但需要在渲染之前根据屏幕宽度将这些列大小转换为像素大小。如果我设置宽度(以像素为单位),浏览器会正确缩放宽度,但是在用户更改列宽时,列会跳转到它们的实际像素大小,从而影响整个表格。知道怎么做吗?