активирайте едно квадратче за отметка h:selectboolean от много вътре в rich:datatable в JSF

Имам rich: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
Като алтернатива използвайте primefaces DataTable - RadioCheckbox - person Nazar Annagurban; 16.01.2013
comment
f:ajax не се поддържа в моето приложение. Вместо това използвам a4j:support. a4j:support има атрибут actionListener, който предполагам, че може да се използва вместо f:ajax listener. Как мога да демаркирам всички тях в метода на боб? можете ли да дадете допълнителна информация? Благодаря ти... - person nudaStck; 16.01.2013
comment
ако проблемът може да бъде решен в Javascript, как може да бъде решен? Или как бих могъл да го реша с метод в bean 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 /›)) код. Обаче не знам какво да направя в bean-а, за да премахна всички отметки. Какво трябва да премине през зърна? Също така обвързах таблицата с данни в 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