Определить столбцы для selectManyCheckbox

Мне нужно показать список selectManyCheckbox в 4 столбцах, но проблема в том, что этот компонент генерирует таблицу, поэтому я понятия не имею, как определить столбцы.

Я работаю с PF 3.4, не могу обновиться до PF 4.x. У вас есть какое-нибудь решение для этого?

ОТРЕДАКТИРОВАНО

Теперь у меня есть это в моем коде

<h:form id="formAdminAccesosXPerfil">

    <h:panelGrid title="Accesos" columns="5">

    <c:forEach items="#{accesosXPerfilMB.listadoAcceso}" var="availableItem" varStatus="loop">

             <h:panelGroup>
                <p:selectBooleanCheckbox id="box_#{loop.index}" value="#{accesosXPerfilMB.checkBoxItems[availableItem]}" />
                <h:outputLabel for="box_#{loop.index}" value="#{availableItem.nombre}" />
            </h:panelGroup>
    </c:forEach>    

    </h:panelGrid>

Managebean, который @ViewScoped

Я изменил предложенный метод, потому что он не работал для меня...

от:

public void save() {
List<E> selectedItems = checkboxItems.entrySet().stream()
    .filter(e -> e.getValue() == Boolean.TRUE)
    .map(e -> e.getKey())
    .collect(Collectors.toList());
// ...

}

к этому:

public void guardarAccesos(){
    try {
        System.out.println("Size: "+getCheckBoxItems().entrySet().size());

        for(BpAcceso acceso:getCheckBoxItems().keySet()){
            System.out.println("Acceso Seleccionado: "+acceso.getNombre());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Но я не получаю ни одного выбранного элемента на hashMap. Просто чтобы убедиться, что я использую jdk1.6


person DuSant    schedule 27.10.2015    source источник


Ответы (1)


Создайте набор компонентов selectBooleanCheckbox в цикле <c:forEach> в цикле <h:panelGrid columns="X"> и измените модель с List<E> на Map<E, Boolean>.

Итак, вместо

private List<E> selectedItems;
private List<E> availableItems;
<p:selectManyCheckbox value="#{bean.selectedItems}">
    <f:selectItems value="#{bean.availableItems}" />
</p:selectBooleanCheckbox>

do

private Map<E, Boolean> checkboxItems;
private List<E> availableItems;

@PostConstruct
public void init() {
    checkboxItems = new HashMap<>();
}
<h:panelGrid columns="4">
    <c:forEach items="#{bean.availableItems}" var="availableItem" varStatus="loop">
        <h:panelGroup>
            <p:selectBooleanCheckbox id="box_#{loop.index}" value="#{bean.checkboxItems[availableItem]}" />
            <h:outputLabel for="box_#{loop.index}" value="#{availableItem}" />
        </h:panelGroup>
    </c:forEach>
</h:panelGrid>
public void save() {
    List<E> selectedItems = checkboxItems.entrySet().stream()
        .filter(e -> e.getValue() == Boolean.TRUE)
        .map(e -> e.getKey())
        .collect(Collectors.toList());
    // ...
}

Обратите внимание, что <ui:repeat> неприменим по причинам, описанным здесь JSTL в JSF2 Facelets... смысл?

person BalusC    schedule 28.10.2015
comment
Я мог бы показать список из 4 столбцов, но я не могу получить выбранные значения в методе сохранения, я использую jdk1.6. По-видимому, список элементов флажка не заполняется выбранными. Я рассчитал размер, и я получил 0 - person DuSant; 28.10.2015
comment
Это работает для меня в проекте блокнота. Чтобы избежать очевидного, вы поместили его в <h:form>, и ваша логика загрузки данных учитывает обратные передачи? (т. е. availableItems относится к области просмотра). - person BalusC; 28.10.2015
comment
Да, это область просмотра, я отредактирую пост, чтобы вы могли увидеть мой код @BalusC - person DuSant; 28.10.2015
comment
Это единственная форма на вашей тестовой странице? Какая реализация/версия JSF? Версии Mojarra старше 2.1.18 имели проблемы с JSTL + @ViewScoped. - person BalusC; 29.10.2015
comment
Версия Jsf 2.1.2, так что у меня проблемы:/ - person DuSant; 29.10.2015
comment
Это действительно древнее. Обходной путь заключается в отключении частичного сохранения состояния (см. также эту ссылку JSTL в конце ответа), но это может иметь некоторое влияние. Лучше всего просто обновить JSF до последней доступной версии 2.1.x (на данный момент это 2.1.29). - person BalusC; 29.10.2015