Основной подход заключается в том, чтобы атрибут rendered
таблиц зависел от выбранного пункта меню.
<p:selectOneMenu value="#{bean.table}">
<f:selectItem itemValue="players" itemLabel="Players" />
<f:selectItem itemValue="jobs" itemLabel="Jobs" />
<f:selectItem itemValue="business" itemLabel="Business" />
...
<p:ajax update="tables" />
</p:selectOneMenu>
<h:panelGroup id="tables">
<p:dataTable value="#{bean.players}" rendered="#{bean.table == 'players'}">
...
</p:dataTable>
<p:dataTable value="#{bean.jobs}" rendered="#{bean.table == 'jobs'}">
...
</p:dataTable>
<p:dataTable value="#{bean.business}" rendered="#{bean.table == 'business'}">
...
</p:dataTable>
...
</h:panelGroup>
Это легко реализовать, но в итоге у вас в коде много кода (который, конечно, можно разделить на <ui:include>
файлы). Более продвинутый и многократно используемый подход мог бы позволить value
отдельной таблицы зависеть от выбранного пункта меню и использовать <p:columns>
для динамического создания столбцов.
<p:selectOneMenu value="#{bean.table}">
<f:selectItems value="#{bean.tables}" />
<p:ajax listener="#{bean.changeModel}" update="table" />
</p:selectOneMenu>
<p:dataTable id="table" value="#{bean.model}" var="item">
<p:columns value="#{bean.columns}" var="column">
<h:outputText value="#{item[column]}" />
</p:columns>
</p:dataTable>
с чем-то вроде:
public void changeModel() {
model = populateModelBasedOn(table);
columns = populateColumnsBasedOn(table);
}
Это позволяет использовать менее детальный контроль, когда вы хотите добавить более специализированные столбцы. Возможно, вы захотите поработать с файлами тегов.