Problema com checkbox

Saudações a todos,

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.

Alguém já passou por isso?

[]´s

Junior

o objeto request (HttpServletRequest) tem um método chamado getParameterValues (String param) que retorna um array de parâmetros…

Gerson,

sou novato no Java e JSF, você teria algum exemplo sobre como utilizar?

[quote=icjunior07]Gerson,

sou novato no Java e JSF, você teria algum exemplo sobre como utilizar?

[/quote]

Hmm… Não sabia que era JSF. Estou fazendo uma tela que vai ter esse tipo de componente… quando eu terminar eu posto aqui a solução…

icjunior07 como está tentando recuperar os checkboxes selecionados?
Posta parte do seu managed-bean e da sua página jsp.

Então Fábio, eu quero pegar o valor dos checkbox selecionados.
Vou postar o JSP

			<h:selectManyCheckbox value="#{distribuicaoFlagranteAction.escolha}" >  
				<f:selectItem itemValue="#{boletimTabela.numero}" itemLabel="#{boletimTabela.numero} / #{boletimTabela.ano}"/>
			</h:selectManyCheckbox>   

Agora o Action

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

Tenta aí e fala se deu certo.
Abraços,

Fábio, sobre o SelectItems, você teria alguma referência sobre a sintaxe?

Por que apenas alterar de selectItem para selectItems não funciona, e não consegui achar uma sintaxe completa do comando.

			<h:selectManyCheckbox value="#{distribuicaoFlagranteAction.escolha}" >  
				<f:selectItem itemValue="#{boletimTabela.numero}" itemLabel="#{boletimTabela.numero} / #{boletimTabela.ano}"/>
			</h:selectManyCheckbox>   

Sobre a lista, eu troquei para String e funcionou também, só que no meu caso ainda está capturando somente o último checkbox que eu clico.

Se você tiver a sintaxe do selectItems eu agradeço,

ref: http://java.sun.com/javaee/javaserverfaces/1.2/docs/tlddocs/

O value do selectItems deve ser um List<SelectItem> ± assim:

//managed-bean
public List&lt;SelectItem&gt; getMeuCheckBox() {
  List&lt;SelectItem&gt; lista = new ArrayList&lt;SelectItem&gt;();
  lista.add(new SelectItem(id1, valor1));
  lista.add(new SelectItem(id2, valor2));
  lista.add(new SelectItem(id3, valor3));
  return lista;
}
//view
&lt;h:selectManyCheckbox value="#{seuBean.suaListaComOsCheckboxSelecionados}" &gt;  
&lt;f:selectItems value="seuBean.meuCheckBox"/&gt;
&lt;h:selectManyCheckbox/&gt;

Acho que deu pra entender né?

Uma pergunta, você está usando vários selectManyCheckbox?

edit: esqueci de fechar a tag

Eu tenho um selectmanycheckbox que é pra uma seleção inicial e depois tenho um outro que é esse que eu estou tentando montar.

Fábio, só uma dúvida cara…

public List<SelectItem> getMeuCheckBox() {  
  List<SelectItem> lista = new ArrayList<SelectItem>();  
  lista.add(new SelectItem(id1, valor1));  
  lista.add(new SelectItem(id2, valor2));  
  lista.add(new SelectItem(id3, valor3));  
  return lista;  
}  

Mas quando faz isso por exemplo ele adiciona 3 checkbox para cada linha.

Eu tentei fazer um for mas aconteceu a mesma coisa:

	public List<SelectItem> getMeuCheckBox() { 
		List<SelectItem> listar = new ArrayList<SelectItem>();
		for(int a = 0; a < boletimOcorrenciasEncontrados.size() ; a++){
		  listar.add(new SelectItem(1, "teste1" ));
		}
		return listar;
	}  

É dessa maneira mesmo?

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&lt;SelectItem&gt; getOpcoesMusicais() {
  List&lt;SelectItem&gt; lista = new ArrayList&lt;SelectItem&gt;();
  //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?

pq eu fiz dessa maneira:

				<h:selectBooleanCheckbox value="#{distribuicaoFlagranteAction.escolha}" >    
					<f:selectItems value="#{distribuicaoFlagranteAction.meuCheckBox}"/>  
				</h:selectBooleanCheckbox>

Mas quando clica no submit ele retorna o seguinte:

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: &lt;h:selectBooleanCheckbox value="#{seuBean.escolha['valor1']}" /&gt;
Segunda opção: &lt;h:selectBooleanCheckbox value="#{seuBean.escolha['valor2']}" /&gt;
Terceira opção: &lt;h:selectBooleanCheckbox value="#{seuBean.escolha['valor3']}" /&gt;

//managed-bean
private Map&lt;String, Boolean&gt; escolha;
//get e set

//para recuperar todos selecionados
Set&lt;Long&gt; keySet = escolha.keySet();
for (Long long1 : keySet) {
  if (escolha.get(long1).booleanValue()) {
    sysout("true");
  } else {
    sysout("false");
  }
}

Tenta aí cara, acho que agora vai!