включить один h: selectbooleancheckbox из многих внутри rich: datatable в JSF

У меня есть богатый: datatable, в котором у меня много столбцов, и один из столбцов - h: selectbooleancheckbox. Я хочу, чтобы пользователи выбирали только один из флажков за раз из множества флажков в таблице данных. Если флажок установлен один раз, у меня нет проблем, я могу отправить его в форму. Например, когда установлен второй флажок, первый следует снять. Как я могу это сделать? Заранее спасибо за вашу помощь... Вот таблица данных, которую я использую:

<rich:dataTable id="vehicleTable" var="vhcl" value="#{tripsBacking.vehicleList}"
binding="#{tripsBacking.vehicleTable}" sortMode="single" 
footerClass="dr-table-footer rich-table-footer"
style="width: 500px; margin: 0px; padding: 0px;">

<rich:column id="col1" width="10px" headerClass="dr-table-header rich-table-header">
    <f:facet name="header">

    </f:facet>
    <h:selectBooleanCheckbox title="#{general.select}" >
    </h:selectBooleanCheckbox>
</rich:column>
<rich:column id="col2" label="#{general.vehicleName}" headerClass="dr-table-header rich-table-header" >
    <f:facet name="header">
        <h:outputText value="#{general.vehicleName}" id="vehicleNameLbl" />
    </f:facet>
    <h:outputText value="#{vhcl.vehicle.vehicleName}" id="vehicleNameValue" />
</rich:column>

<rich:column id="col3" label="#{general.vehicleType}" headerClass="dr-table-header rich-table-header" >
    <f:facet name="header">
        <h:outputText value="#{general.vehicleType}"
            id="state_capital" />
    </f:facet>
    <h:graphicImage value="#{vhcl.typeImage}" height="40" width="40" align="left"/>
</rich:column>
<rich:column id="col4" label="#{general.lastMessageDate}"
    headerClass="dr-table-header rich-table-header" > 
    <f:facet name="header">
        <h:outputText value="#{general.lastMessageDate}" id="lastMsgDateLabel" />
    </f:facet>
    <h:outputText value="#{vhcl.messageDate}" id="lastMsgDate" /> 
</rich:column>
<rich:column id="col5a" label="#{general.address}"
    headerClass="dr-table-header rich-table-header" >
    <f:facet name="header">
        <h:outputText value="#{general.address}" id="addressLabel" />
    </f:facet>
    <h:outputText value="#{vhcl.address}" id="addr" />
</rich:column>


person nudaStck    schedule 16.01.2013    source источник


Ответы (1)


Ajax отправляет каждое изменение и имеет метод прослушивания действий, который отменяет выбор всех ранее выбранных элементов из списка.

<h:selectBooleanCheckbox title="#{general.select}" >
    <a4j:support event="onclick" listener="#{tripsBacking.selectSingleRow}" reRender="vehicleTable">
       <!-- use property that uniquely identifies a row -->
       <f:attribute name="selectedVehicleName" value="#{general.vehicleName}"/>
    </a4j:support>
</h:selectBooleanCheckbox>

Это будет примерно так, как показано выше, где deselectAll — это метод слушателя действий в вашем bean-компоненте:

public void selectSingleRow(ActionEvent event) {
    String vehicleName = (String) event.getComponent().getAttributes().get("selectedVehicleName");
    for (Vehicle v : vehicleList) {
          if (!v.getVehicleName.equals(vehicleName)) {
               v.setSelected(false);     
          }
    } 
}
person Nazar Annagurban    schedule 16.01.2013
comment
В качестве альтернативы используйте простые лица DataTable – RadioCheckbox. - person Nazar Annagurban; 16.01.2013
comment
f:ajax не поддерживается в моем приложении. Вместо этого я использую a4j:support. a4j:support имеет атрибут actionListener, который, я думаю, можно использовать вместо слушателя f:ajax. Как я могу отменить выбор всех из них в методе bean? не могли бы вы предоставить дополнительную информацию? благодарю вас... - person nudaStck; 16.01.2013
comment
если проблема может быть решена в Javascript, как она может быть решена? Или как я могу решить это с помощью метода в bean-компоненте??? любая помощь будет принята с благодарностью... - person nudaStck; 16.01.2013
comment
Я отредактировал свой ответ, чтобы привести более четкий пример. Это будет по этим линиям. Вы можете добиться того же с помощью Javascript, но это может быть проблематично с таблицами, которые используют разбиение на страницы. - person Nazar Annagurban; 17.01.2013
comment
Во-первых, моя таблица не использует пагинацию. У меня есть прокручиваемая таблица данных, поэтому я не использую разбивку на страницы. Как я могу решить это с помощью Javascript. На моей странице Jsf я написал что-то вроде ((‹a4j:support event=onchange actionListener=#{tripsBacking.deselectAll} reRender=infoForm /›)) код. Однако я не знаю, что делать в фоновом компоненте, чтобы снять все флажки. Что должно проходить в бине? Я также привязал datatable к bean-компоненту. - person nudaStck; 17.01.2013
comment
Взгляните на мой первоначальный ответ, я вызвал метод deselectAll() selectSingleRow. Он отменяет выбор всех строк, кроме одной. - person Nazar Annagurban; 17.01.2013
comment
Да, я проверил ваш ответ. Это мне очень помогло. Большое спасибо... Я действительно ценю это. - person nudaStck; 17.01.2013
comment
Добро пожаловать :) Примите ответ, чтобы он был помечен как отвеченный :) - person Nazar Annagurban; 17.01.2013