我有一个包含31列和60行的数据表,渲染速度非常慢。它逐个呈现细胞。性能与数据库无关,我创建了表现出相同性能的模拟数据集。我无法减少列数,需要立即显示整月。
我正在使用PrimeFaces 3.5,没有升级选项。
有加速渲染的技巧吗?
我创建了以下数据表:
<p:dataTable id="calendar" value="#{calendarView.calendarData.entrySet().toArray()}" var="row" frozenColumns="1" scrollable="true" >
<p:columnGroup type="header">
<p:row>
<p:column headerText="#{msgs.calendar_roomNumber}" style="text-align: right; float:right; width:100px;"/>
<c:forEach items="#{calendarView.columnData}" var="column">
<p:column headerText="#{column}"/>
</c:forEach>
</p:row>
</p:columnGroup>
<p:column headerText="Szoba">
<h:outputText value="#{row.key.roomNumber}" />
</p:column>
<c:forEach items="#{calendarView.columnData}" var="column">
<p:column style="background-color:#{not empty row.value[column]?row.value[column].getRoomState().toString():''}">
<h:outputText value="SZ" id="column#{column}" rendered="#{empty row.value[column]}" />
<p:tooltip id="toolTipFadeColumn#{column}" for="column#{column}" position="top" escape="false" value="#{row.value[column].label}" />
<h:outputText rendered="#{not empty row.value[column] and row.value[column].endStaying}" value="->" id="columnend#{column}"/>
<h:outputText rendered="#{not empty row.value[column] and row.value[column].startStaying}" value="<-" id="columnstart#{column}"/>
<p:tooltip id="toolTipFadeEnd#{column}" for="columnend#{column}" position="top" escape="false" value="#{row.value[column].label}" rendered="#{not empty row.value[column].label}"/>
<p:tooltip id="toolTipFadeStart#{column}" for="columnstart#{column}" position="top" escape="false" value="#{row.value[column].label}" rendered="#{not empty row.value[column].label}"/>
</p:column>
</c:forEach>
</p:dataTable>
calendarData有60个元素,并且具有以下bean的Map<Room,Map<Long,RoomCell>>
结构:
public class RoomCell {
private boolean endStaying=false;
private boolean startStaying=false;
private RoomState roomState=RoomState.FREE;
private String labels;
...
}
@Entity
@Table(name = "room")
public class Room extends AbstractModelImpl implements Comparable{
@Column(name = "room_number", unique = true)
private int roomNumber;
@Column(name="room_type")
@Enumerated(EnumType.STRING)
private RoomType roomType;
@OneToMany(mappedBy = "id", fetch = FetchType.LAZY)
private List<Staying> stayings;
...
}
答案 0 :(得分:0)
在摆弄dataTable之后,我创建了具有足够(不完美)性能的dataTable优化版本。我做了以下修改:
所有工具提示都替换为标题属性
<p:dataTable id="calendar" value="#{calendarView.calendarData.entrySet().toArray()}" var="row" frozenColumns="1" scrollable="true" scrollHeight="600" scrollWidth="1300">
<p:column style="width: 50px; text-align: right">
<f:facet name="header">
<h:outputText value="#{msgs.calendar_room}" />
</f:facet>
<h:outputText value="#{row.key.roomNumber}" />
</p:column>
<p:columns value="#{calendarView.columns}" var="column" style="text-align: center; #{not empty row.value[column].color ? 'background-color:'.concat(row.value[column].color):''}">
<f:facet name="header">
<h:outputText value="#{column}" />
</f:facet>
<h:outputText rendered="#{row.value[column].endStaying == true}" value="->" id="endStaying">
<f:attribute name="title" value="#{row.value[column].label}" escape="true" />
</h:outputText>
<h:outputText rendered="#{row.value[column].startStaying == true}" value="<-" id="startStaying" >
<f:attribute name="title" value="#{row.value[column].label}" escape="true" />
</h:outputText>
<h:outputText rendered="#{row.value[column].endStaying == false and row.value[column].startStaying == false and not empty row.value[column].label}" value="-" id="staying" >
<f:attribute name="title" value="#{row.value[column].label}" escape="true" />
</h:outputText>
</p:columns>
</p:dataTable>