Я нашел это решение:
это пример для тех, кто найдет ту же сложность, с которой я столкнулся при создании Динамическая панель инструментов (всеявляется динамическим).
Мой проблемный вопрос
Проект: Отображение пустой панели инструментов, которую визуализирует пользовательменю в правой части ФОРМА с доступным из конференц-зала .После щелчка по одному конференц-залу модель будет обновлена, и панель отобразится в правом столбце (предварительно назначенному ее идентификатору).Я динамически назначаю каждый идентификатор, номер столбца, номер панели и номер элемента, визуализируемого внутри каждой панели.
Прежде всего, введите Java DashboardModel с пустым столбцом:
private DashboardModel model;
private List<DashboardColumn> dashboardColumn;
DashboardColumn columnTmp = new DefaultDashboardColumn();
model.addColumn(columnTmp);
columnDashboard.add(columnTmp);
Логически вы должны создать геттер и сеттер для модели.Я создаю список DashboardColumn для удобного управления каждым столбцом.
Заполняем список объекта meetingRoom с именем meetingRoomByOffice.Этот список будет необходим actionMenu для создания динамического элемента внутри меню.
for(x = 0;x<tempMeetingRoom.size();x++)
{
meetingRoomByOffice.add(tempMeetingRoom.get(x));
}
Я заполняю двумерный массив для сохранения идентификатора каждого столбца (column1 = 1 идентификатор офиса)с реальной позицией внутри списка (ID: 450 - позиция внутри списка 0 и т. д.)
for(i = 0;i<officesList.size();i++) {
officePositionAndColumn[i][0] = (int) (long) officesList.get(i).getId();
officePositionAndColumn[i][1] = i;
}
После этого создайте элемент внутри XHTML.во-первых, actionMenu
NOTE Я получил личную, без особых изменений
<smifn:actionsMenu id="tableAddMeetingRoom" styleClass="col-xs-8 col-md-12 text-right"
onclick="@this.update()"
title="#{msg['booking.add_meeting_room']}">
<c:forEach items="#{homeReceptionDashboardBck.meetingRoomByOffice}" var="meetingRoomElement">
<p:menuitem id="#{homeReceptionDashboardBck.getMenuItemId(meetingRoomElement)}"
action="#{homeReceptionDashboardBck.onAddPanel(meetingRoomElement)}"
process="@this"
value="#{meetingRoomElement.name}"
icon="icon-add-3"
iconPos="left"
update ="widgetBookingReception">
</p:menuitem> <!-- oncomplete="PF('bookingSelect').show()"-->
</c:forEach>
</smifn:actionsMenu>
- First foreach ---> получить список элементов и просмотреть их один за другим с «именем» meetingRoomElement
- Чтобы получить идентификатор, я выполнил определенный вызов метода getMenuItemId, который генерирует идентификаторс названием конференц-зала, разделенного.Примерно так: Имя: Sala Demo -> ID: Sala__Demo
- Действие вызывает основной метод для изменения модели, я объясню это после этого списка.
update ="widgetBookingReception">
важнообновить всю FORM
Метод onAddPanel
У меня есть специальный класс с двумя основными объектами:
- idWidget , что это строка
- meetingRoom , что это объект MeetingRoom
Прежде всего, я создаюИдентификатор с одним подчеркиванием
String [] nameMeetingRoom = panelSelected.getName().split(" ");
String idWidget = nameMeetingRoom[0]+"_"+nameMeetingRoom[1];
Создайте и добавьте его в объект TMP, после чего вставьте «виджет» в список вставленных виджетов в модель пользователем.Это важно, чтобы избежать потерянных виджетов.
DashboardWidget tmp = new DashboardWidget();
tmp.setIdWidget(idWidget);
tmp.setName(panelSelected.getName());
tmp.setOffice(panelSelected.getOffice());
widgets.add(tmp);
Теперь я найду позицию в списке, обновлю модель и список доступныхOFMeetingRoom внутри меню.
for(i = 0;i<officePositionAndColumn.length;i++)
{
//se l'id che era stato impostato è uguale a quello passato
if(officePositionAndColumn[i] [0] == panelSelected.getOffice().getId())
//posizione della colonna che va da 0 a n.
columnPosition = officePositionAndColumn[i][1];
}
//se è stato trovata la posizione della colonna
if(columnPosition>=0) {
//mi ricavo la colonna
DashboardColumn columnSelected = new DefaultDashboardColumn();
columnSelected = columnDashboard.get(columnPosition);
//imposto l'id al widget
columnSelected.addWidget(idWidget);
//sovrascrivo la colonna con quella modificata
columnDashboard.set(columnPosition, columnSelected);
//reimposto il modello e ricarico le colonne
setModel(new DefaultDashboardModel());
for(i = 0;i<columnDashboard.size();i++)
{
this.model.addColumn(columnDashboard.get(i));
}
for(i = 0;i<meetingRoomByOffice.size();i++)
{
if(meetingRoomByOffice.get(i).equals(panelSelected))
{
meetingRoomByOffice.remove(i);
}
}
Этокак я обновляю всю модель.Но теперь мы должны обновить его в XHTML.
Я создаю полную динамическую панель мониторинга, это код:
<p:dashboard widgetVar="dash" model ="#{homeReceptionDashboardBck.model}">
<c:when test="not empty #{homeReceptionDashboardBck.widgets}">
<c:forEach items="#{homeReceptionDashboardBck.widgets}" var="Element">
<p:panel id="#{Element.idWidget}" header="#{Element.name}">
<c:when test="not empty #{homeReceptionDashboardBck.uploadBooking(Element)}">
<c:forEach items="#{homeReceptionDashboardBck.uploadBooking(Element)}" var="row">
<h:outputText value="#{homeReceptionDashboardBck.getEventGeneralInfo(row)}"> </h:outputText>
<h:outputText> <br/></h:outputText>
</c:forEach>
</c:when>
<c:otherwise>
<c:when test="#{homeReceptionDashboardBck.uploadBooking(Element)}">
<h:outputText value="Nessun evento prenotato"> </h:outputText>
<h:outputText> <br/></h:outputText>
</c:when>
</c:otherwise>
</p:panel>
</c:forEach>
</c:when>
</p:dashboard>
Будьте осторожны, внутри foreach вы не можете передать пустой список или пустой список.Я использую WHEN , чтобы предотвратить это.
Если у вас возникнут вопросы, я с удовольствием отвечу и поделюсь с вами частью моего кода. До скорой встречи: D