Estou desenvolvendo uma aplicação na qual eu coloco um selectmanycheckbox em uma JSP passando como parâmetro um código para a Action. São várias linhas e queria selecionar mais de uma linha ao mesmo tempo e enviar para a minha Action, mas, só funciona quando eu seleciono a última linha da tabela, aí ele passa o parâmetro, se selecionar outras linhas, ele não passa nada, ou se selecionar a última e qualquer outra ele passa apenas a última.
Estava tentando capturar os dados dos checkbox desta maneira
List<SelectItem> list = getEscolha();
for (int i = 0 ; i < list.size() ; i++){
FacesUtils.dispararMensagem(" Selecionado mais de um boletim. " + list.get(i));
FacesUtils.dispararMensagem(" Tamanho de list. " + list.size());
}
icjunior07 acho que você deveria estar usando o <f:selectItems /> pois, desse jeito que você postou, só será renderizado um checkbox apenas. Se você deseja renderizar um checkbox para cada registro de uma lista por exemplo, sugiro que utilize o selectBooleanCheckbox ok?
Mas imaginando que esteja funcionando assim, eu costumo recuperar os checkboxes selecionados utilizando um List<String>(string para não usar converter, depois você implementa um para retornar o que você precisa de fato) no caso seu value escolha não precisa ser do tipo SelectItem
Fala icjunior07 vamos ver se ti ajudo.
No exemplo que lhe passei, ele adicionaria sim 3 checkbox, agora na mesma linha eu não entendi, se você deixou seu selectManyCheckbox dentro de um dataTable por exemplo, ele adicionaria sim 3 checkbox na mesma linha, por isso lhe perguntei anteriormente como você pretendia utiliza-los, se o seu objetivo fosse criar um checkbox para cada registro de uma lista por exemplo, era melhor utilizar o selectBooleanCheckbox. Vou tentar explicar pensando em cenários:
Utilizando selectManyCheckbox: imagine uma tela de cadastro que além dos seus dados pessoais, você possa escolher seu gosto por tipos de música, como rock, pop…etc, nesse caso poderiamos fazer algo do tipo:
public List<SelectItem> getOpcoesMusicais() {
List<SelectItem> lista = new ArrayList<SelectItem>();
//adicionando na mão, mas poderia ser infos do db
lista.add(new SelectItem(1, "Rock"));
lista.add(new SelectItem(2, "Jazz"));
lista.add(new SelectItem(3, "Dance"));
return lista;
}
Na página jsp era só adicionar as tags como mostrei no post anterior, e para recuperar os checkbox selecionados era só declarar um value do tipo List<String> por exemplo.
Utilizando selectBooleanCheckbox: uma lista de usuários(exemplo mais fácil que consigo pensar a essa hora), imagine uma listagem de todos os usuários cadastrados no seu sistema, listagem essa feita via um dataTable do jsf…e você deseja criar um checkbox para cada usuário e poder selecionar o checkbox e exclui-los de uma vez só. Então dentro do seu dataTable você adicionaria um selectBooleanCheckbox para cada registro, assim após acionar o método excluir do seu managed-bean você recuperava todos os checkbox e deletava todos com valor igual a true.
Deu para entender ± como utilizar um ou outro? espero que agora você consiga fazer o que deseja.
Abraços,
Fala Fabio, blz cara, eu entendi agora a diferença entre os dois.
Estou tentando fazer com select checkbox, mas fiquei com uma dúvida…
Quando chamo meu bean, mandando para a variável, no meu caso chama escolha, ela pode ser um list de string?
Não, usando o selectBooleanCheckbox tem quer ser um boolean mesmo, no seu caso a propriedade escolha e não pode ser list, é uma propriedade única, se você deseja criar uma propriedade só para todos os selectBooleanCheckbox da sua lista, aí é um pouco mais trash, só consegui fazer isso pegando uma dica de um post daqui do guj mesmo, tinha que utilizar um Map(sugiro você testar com um só primeiro)
Com map ficaria assim:
//jsp
Primeira opção: <h:selectBooleanCheckbox value="#{seuBean.escolha['valor1']}" />
Segunda opção: <h:selectBooleanCheckbox value="#{seuBean.escolha['valor2']}" />
Terceira opção: <h:selectBooleanCheckbox value="#{seuBean.escolha['valor3']}" />
//managed-bean
private Map<String, Boolean> escolha;
//get e set
//para recuperar todos selecionados
Set<Long> keySet = escolha.keySet();
for (Long long1 : keySet) {
if (escolha.get(long1).booleanValue()) {
sysout("true");
} else {
sysout("false");
}
}