Checkbox em uma tabela

14 respostas
liviaguedes

Olá a td´s,

Bom eu estou desenvolvendo um programinha de biblioteca…e gostaria de saber se tem como colocar um checkbox dentro de uma tabela…
tipo um formulario de consulta…
bom quebrei minha cabeça e nem tenho ideia de como faz…se alguem puder me ajudar…

vlwww… :wink:

14 Respostas

mcbarsotti

public ArrayList getComboPerfil() throws DAOException { ArrayList results = new ArrayList(); CallableStatement stmt = null; ResultSet rs = null; try{ stmt = getConnection().prepareCall("{call SP_ADMINISTRA_USUARIO(?,?,?,?,?,?,?)}"); stmt.setString("PASSO", "SCP"); stmt.setNull("COD_RECURSO", java.sql.Types.INTEGER); stmt.setNull("DSC_NOME_COMPLETO", java.sql.Types.VARCHAR); stmt.setNull("ID_LOG", java.sql.Types.INTEGER); stmt.setNull("LOGIN_SISTEMA", java.sql.Types.VARCHAR); stmt.setNull("COD_PERFIL", java.sql.Types.INTEGER); stmt.setNull("DSC_SENHA", java.sql.Types.VARCHAR); rs = stmt.executeQuery(); while (rs.next()){ Map papel = new HashMap(); papel.put("valor",rs.getInt(1)); papel.put("label", rs.getString(2)); results.add(papel); } }catch (SQLException e) { s_log.error(e.getMessage()); throw new DAOException(e.getCause()); } finally { DAOFactory.releaseResources(stmt, rs); } return results; }
é criado um map (http://www.javafree.org/news/view.jf?idNew=3, ligando o codigo do item no combo, com a sua descrição

onde o valor é o que será enviado para seu servlet quando o usuario escolher um item no cb, e o label é oque vai aparecer como opção, oque ele visualizar e escolhera…

na web eu faço assim, não sei se para vc é aproveitavel, mas ta ai…

Boa sorte!

ViniGodoy

Se você está usando um JTable, basta fazer com que seu TableModel indique que a classe da coluna em questão é do tipo Boolean.

Veja isso neste tutorial do swing:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

liviaguedes

poxa vlw…
vou tentar…e qlq coisa eu grito por socorro… 8) 8)
brigadinha…rsrsrsr

liviaguedes

Bom entao vamos la…eu tenho uma Classe chamanda

package apresentacao;

import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

import negocios.Autor;

public class ModeloTabela extends AbstractTableModel {

	ArrayList autor;
	//Checkbox check = new Checkbox(" ");
		
	public ModeloTabela(ArrayList autor) {
		this.autor=autor;
	}
		
	void atualizaDados(ArrayList autor){
		this.autor=autor;
		fireTableDataChanged();
	}
	
	// 3 colunas> coluna 1: checkbox, coluna 2: codigo e coluna 3: nome
	public int getColumnCount() {
		return 3;
	}
	
	public int getRowCount() {		
		return autor.size();
	}
	
	public Object getValueAt(int linha, int coluna) {
		
		if (coluna == 0)
			//return 	check ;				
		if (coluna == 1)
			return ((Autor)autor.get(linha)).getCodigo();
		if (coluna == 2)
			return ((Autor)autor.get(linha)).getNome();
		return "???";
		
	}
	
	public String getColumnName(int coluna) {
		if (coluna == 0)
			return " ";
		if (coluna == 1)
			return "Código";
		if (coluna == 2)
			return "Nome";
		return "???";
	}   
}

e tipo eu gostaria de add na 1° coluna um checkbox…

-> é possivel ?? pq assim …eu ate vi o tutorial, mas entendo o basico de ingles…me viro…mas ta dificil viu…

se alguem puder me fala se é possivel…ou nao…
vlwssss :wink: :wink:

ViniGodoy

O seu model vai trabalhar apenas com o campo boolean, não com o checkbox direto. Não é necessário nem ter uma instancia do checkbox no model.

Agora que seu model está quase pronto, só faltou sobrescrever o método getColumnClass:

public Class&lt?&gt getColumnClass(int column) { if (column == 0) return Boolean.class; return super.getColumnColumnClass(column); }

Isso faz com que o model avise a tabela que o primeiro campo é booleano. Por padrão, o JTable usará um checkbox como renderer e editor para campos booleanos.

Depois, para coluna 0, no getValueAt, retorne o campo booleano de seu autor, que você deseja mostrar na tabela.

Esse tópico tem uma dúvida muito similar a sua e lá coloquei uma breve explicação de como funciona o model:
http://www.guj.com.br/posts/list/57032.java#299500

Se você precisar tornar a tabela editável, também precisará sobrescrever os métodos isCellEditable e setValueAt.

fabiel

vai no C:\Arquivos de programas\Java\jdk1.5.0_06\demo\jfc\SwingSet2 la tem um jar executa ele

liviaguedes

wlss…vou olhar…brigadao…

liviaguedes

Bom…agora o checkbox ja ta na tabela…so q to com um problema…
no setValueAt… eu nao sei a sintaxe certa…

Só consigo editar o 1° checkbox da primeira linha os outro nao…
como eu faço esse metodo??

Na coluna 0 eu coloquei os checkbox…
tipo o meu codigo ta assim:

public boolean isCellEditable(int linha, int coluna)
		{
			return (coluna == 0);
		}
	
	public void setValueAt(Object aValue, int linha, int coluna)
		{
		     //  editora = (ArrayList) aValue;
		}
ViniGodoy

No seu table model você tem uma lista de autores, certo?

O que o setValue diz que o campos da linha x e da coluna y foi alterado. Como as linhas geralmente correspondem ao índice em seu List, basta pegar o elemento daquele índice e altera-lo.

//Crie constantes para o nome da coluna.
private static final int COL_CHECK = 0;

public boolean isCellEditable(int linha, int coluna)
{
      return (coluna == COL_CHECK);
}
 	
public void setValueAt(Object aValue, int linha, int coluna)
{
    if (colunha == COL_CHECK) { //A alteração foi na coluna do checkBox
        //Aqui defino o campo booleano do autor. 
        //Não sabia o nome do seu campo, pq vc ainda não escreveu.
        autor.get(linha).setChecked((Boolean)aValue); 
    }
}

Só uma dica. Para as coisas não ficarem confusas com o tempo, crie constantes com o nome das colunas, ao invés de ficar referenciando elas pelo indice direto, como fiz ali em cima. ;)

liviaguedes

entao vini…testei e esse setChecked ele nao funciona …eu teria q criar esse metodo certo… como eu faço ele…

cara vou te mostrar meu codigo…pra tu ver…pq acho q ta meio zoneado neh…Essa classe é o medelo da minha tabela…

package apresentacao;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

import negocios.Autor;

public class ModeloTabelaAutor extends AbstractTableModel {

	private static final long serialVersionUID = 1L;
	ArrayList autor;
	
	private static final int COL_CHECK = 0;
	private static final int COL_CODIGO = 1;
	private static final int COL_NOME = 2;
	
	public ModeloTabelaAutor(ArrayList autor) {
		this.autor=autor;
	}
		
	void atualizaDados(ArrayList autor){
		this.autor=autor;
		fireTableDataChanged();
	}
	
	// 3 colunas> coluna 1: checkbox, coluna 2: codigo e coluna 3: nome
	public int getColumnCount() {
		return 3;
	}
	
	public int getRowCount() {		
		return autor.size();
	}
	
	public Object getValueAt(int linha, int coluna) {
		if (coluna == COL_CHECK)
			 return new Boolean(false);				
		if (coluna == COL_CODIGO)
			return ((Autor)autor.get(linha)).getCodigo();
		if (coluna == COL_NOME)
			return ((Autor)autor.get(linha)).getNome();
		return "??";		
	}
	
	public Class<?> getColumnClass(int coluna) {
	     if (coluna == 0)
	        return Boolean.class;
	       return super.getColumnClass(coluna);
	  }

	public boolean isCellEditable(int linha, int coluna)
		{		   
		  return (coluna == COL_CHECK);
		}
	
	public void setValueAt(Object aValue, int linha, int coluna)
		{
		  if (coluna == COL_CHECK) { 
			  autor.get(linha).setChecked((Boolean)aValue); 
	      }
		}
	/*
	public void setChecked(Boolean boolean1) {
		
	}
	*/ 
	
	public String getColumnName(int coluna) {
		if (coluna == 0)
			return "";
		if (coluna == 1)
			return "Código";
		if (coluna == 2)
			return "Nome";
		return "???";
	}   
}

ele ate funciona…mas o check box so funciona em um unica linha, eu posso ter 10 linhas mas so uma fik editavel…oq sera q to fazendo de errado??

ah vlw pela ajuda vini… :wink: :wink:

ViniGodoy

Veja bem... o seu modelo deve fornecer o dado do getValueAt e alterar esse mesmo dado no setValueAt. Se a propriedade de checked não pertence ao seu autor, talvez você tenha que trabalhar com duas listas em paralelo:

package apresentacao;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import negocios.Autor;

public class ModeloTabelaAutor extends AbstractTableModel {
    private static final int COL_CHECK = 0;
    private static final int COL_CODIGO = 1;
    private static final int COL_NOME = 2;
    private static final int NUM_COLUNAS = 3;

    private List autor;
    private List check; //Marca se o autor está ou não selecionado


    public ModeloTabelaAutor(List autor) {
        this.autor = autor;
        check = new ArrayList();
        for (int i = 0; i &lt autor.size(); i++)
           check.add(Boolean.FALSE); //Valor default.
    }

    public int getColumnCount() {
        return NUM_COLUNAS;
    }

    public int getRowCount() {
        return autor.size();
    }

    public Object getValueAt(int linha, int coluna) {
        if (coluna == COL_CHECK)
            return check.get(linha) == Boolean.TRUE;
        if (coluna == COL_CODIGO)
            return ((Autor) autor.get(linha)).getCodigo();
        if (coluna == COL_NOME)
            return ((Autor) autor.get(linha)).getNome();
        return &quot;??&quot;;
    }

    public Class&lt ? &gt getColumnClass(int coluna) {
        if (coluna == COL_CHECK)
            return Boolean.class;
        if (coluna == COL_CODIGO || coluna == COL_NOME)
            return String.class;
        
        return super.getColumnClass(coluna);
    }

    public boolean isCellEditable(int linha, int coluna) {
        return (coluna == COL_CHECK);
    }

    public void setValueAt(Object aValue, int linha, int coluna) {
        if (coluna == COL_CHECK)
            check.set(linha, (Boolean) aValue);
    }

    public String getColumnName(int coluna) {
        if (coluna == 0)
            return &quot;&quot;;
        if (coluna == 1)
            return &quot;Código&quot;;
        if (coluna == 2)
            return &quot;Nome&quot;;
        return &quot;???&quot;;
    }
    
    /**
     * Esse método é para permitir que você pergunte ao modelo se um autor está ou 
     * não selecionado.
     */
    public boolean isChecked(Autor autor) {        
        return check.get(this.autor.indexOf(autor)) == Boolean.TRUE;
    }
}

Você está trabalhando com Java 4? Notei que seu código não usa generics. Se for no Java 5, seria melhor usa-los para evitar alguns casts.

Outra dica é usar a interface list, ao invés de ArrayList direto, como no exemplo que eu coloquei ali em cima...

liviaguedes

poxa vini…vlw pelas dicas…consegui…ta funcionando…
nem precisei usar duas listas…

:lol: 8) :smiley: :slight_smile: :Pbrigadao… :wink:

liviaguedes

oi vini..vc sabe como eu pego o valor do checkbox em outro formulario..
é q eu tenho um form de consulta e tem um botao onde exclui os autores q estiverem marcado com true..

tipo:
public void pressionouExcluir() {

     ArrayList autor = objDadosCompletos.ConsultaAutor();
		
     for (int i=0; i &lt autor.size();i++) {
        Autor autores = (Autor)autor.get(i);
        Checkbox chk = (Checkbox)autor.getComponent(i);
				
    if (chk.getState())
      objDadosCompletos.ExcluirAutor(autores.getCodigo(), autores.getNome());
}
		
   dispose();
   new FrmConsultaAutor().setVisible(true);
}

bom c vc puder me ajudar agradeceria muito...vlw
bjs..ate..

tipo

ViniGodoy

Basta passar a lista dos autores marcados para o outro formulário, através de um método ou do construtor desse formulario.

Lembre-se formularios e janelas são como qualquer outro objeto.

Dê uma olhada aqui também.

Criado 12 de abril de 2007
Ultima resposta 23 de abr. de 2007
Respostas 14
Participantes 4