Как отображать элементы с изображением в p: selectManyCheckbox

Мне нужно отобразить <p:selectManyCheckbox> элементов с изображениями. Я пытался отображать изображения с помощью <p:selectOneRadio>. Это работает нормально. Я программно добавляю компоненты в пользовательский интерфейс. Это мой код.

answerRadio.setLayout("custom"); //answerRadio is SelectOneRadio
customPnl = (PanelGrid) app.createComponent(PanelGrid.COMPONENT_TYPE);
            customPnl.setId("pnl"+qstnCnt);
            customPnl.setColumns(3);
radioBtn = (RadioButton) app.createComponent(RadioButton.COMPONENT_TYPE);
                        radioBtn.setId("opt"+qstnAnsIndx);
                        radioBtn.setFor("ID of answerRadio");
                        radioBtn.setItemIndex(ansIndx);
                        customPnl.getChildren().add(radioBtn);

outPnl.getChildren().add(answerRadio); //outPnl is OutputPanel that include answerRadio
outPnl.getChildren().add(customPnl);

Это <p:selectOneRadio> с изображениями.

Я хотел бы использовать <p:selectManyCheckbox> таким же образом. Но PrimeFaces имеет только <p:radioButton> для пользовательского макета, а не <p:checkbox>, как этот. Как я могу достичь этого в любом случае? Как я могу отображать <p:selectManyCheckbox> элементов с изображениями?


person Duk    schedule 06.01.2015    source источник
comment
Что касается объявления/создания компонентов: нет ничего невозможного в XHTML и возможного только в Java. Эта Java в основном представляет собой нечитаемый беспорядок по сравнению с XHTML <p:selectOneRadio>/<p:radioButton>. Я настоятельно рекомендую перестать объявлять/создавать компоненты в контроллере и вместо этого делать это в представлении, как это делает любой другой здравомыслящий разработчик JSF.   -  person BalusC    schedule 06.01.2015
comment
Итак, что мне нужно сделать?   -  person Duk    schedule 06.01.2015
comment
Просто используйте XHTML. Это намного удобнее для чтения и обслуживания.   -  person BalusC    schedule 06.01.2015


Ответы (1)


Это невозможно с <p:selectManyCheckbox>. Лучше всего вместо этого использовать набор компонентов <p:selectBooleanCheckbox> и изменить модель должна быть Map<Entity, Boolean> вместо List<Entity>. Вы можете перебрать его, используя <ui:repeat>.

Например. (обычный вариант XHTML; я не собираюсь защищать эквивалент Java createComponent()):

<ui:repeat value="#{bean.entities}" var="entity">
    <p:selectBooleanCheckbox value="#{bean.selection[entity]}" />
    ... (you can put here image, label, anything)
</ui:repeat>

с

private List<Entity> entites; 
private Map<Entity, Boolean> selection;

@PostConstruct
public void init() {
    entities = service.list();
    selection = new HashMap<>(); // No need to prefill it!
}

Чтобы проверить, какие из них выбраны, выполните цикл по карте в методе действия:

List<Entity> selectedEntities = new ArrayList<>();

for (Entry<Entity, Boolean> entry : selection.entrySet()) {
    if (entry.getValue()) {
        selectedEntities.add(entry.getKey());
    }
}
person BalusC    schedule 06.01.2015
comment
это верный путь. - person Duk; 06.01.2015