Modelo de Tabela com JCheckBox - Poder escolher apenas 1 check da tabela!

9 respostas
Alchemist

Pessoal to com uma duvida simples, eu tenho este modelo para a minha tabela, a primeira coluna contem um check box, eu queria travar de modo que o usuario possa só escolher um check…

não tenho a minima noção de como fazer :S

package view.tablemodel;

import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.swing.table.DefaultTableModel;

import model.GerarRelatorio;

public class TableModelGerarArquivo extends DefaultTableModel{
	   
	   private static final long serialVersionUID = 1L;
	   private Map<Integer,GerarRelatorio> listaGerarRelatorio;  
	   public List<GerarRelatorio> vetor;
	   private List<Boolean> booleans;
	   
	   public TableModelGerarArquivo(Map<Integer,GerarRelatorio> lista){
		  
		   this.listaGerarRelatorio = lista;  
		   vetor = new Vector<GerarRelatorio>(listaGerarRelatorio.values());  
		   booleans = new Vector<Boolean>();  
	
		   for (int x = 0; x < vetor.size(); x++) {  
			   	booleans.add(false);  
		   } 
	    }  
	
	   public int getColumnCount() {
		   return 4;
		 }   
	
	   public String getColumnName(int coluna) {    
	       switch(coluna){  
	         case  0:return "ITEM";  
	         case  1:return "INSTITUICAO";  
	         case  2:return "TIPO RELATORIO";  
	         case  3:return "ANO";  
	         default:return "";  
	       }  
	    }  
	   
	   public Object getValueAt(int linha, int coluna) {
		   
		   GerarRelatorio instituicaoControle = vetor.get(linha);  
	      switch(coluna){  
	         case  0:return booleans.get(linha);  
	         case  1:return instituicaoControle.getDS_INSTITUICAO();
	         case  2:return instituicaoControle.getDS_RELATORIO();  
	         case  3:return instituicaoControle.getNR_ANO();
	         default:return "";
	       }  
	   }  
	  
	   public Class<?> getColumnClass(int coluna) {  
		   switch(coluna){  
	       case  0:return Boolean.class;    
	       case  1:return String.class;  
	       case  2:return String.class;  
	       case  3:return Integer.class;  
	       default:return Object.class;  
	       }  
	    }
	
	    public int getRowCount() {  
	      return listaGerarRelatorio != null ? listaGerarRelatorio.size(): 0;  
	    } 
	
	    public boolean isCellEditable(int linha, int coluna) {  
	    	return coluna == 0; 
		}
	    
	     public void setValueAt(Object ob, int linha, int coluna) {  
	        if (coluna != 0 || !Boolean.class.isInstance(ob)) {  
	            return;  
	        }  
	        booleans.remove(linha);  
	        booleans.add(linha, (Boolean) ob);  
	     }

}

9 Respostas

Alchemist

Pessoal outra pergunta rapida para aproveitar o topico!!

esta minha tabela tem 4 colunas !

ITEM que é JCheckBox | INSTITUICAO | TIPO RELATORIO | ANO

eu gostaria de saber se é possivel passar um id oculto para o model, queria pegar este id quando o usuario clicar no botão de gerar o relatorio… n sei se deu para entender a idea !!

ViniGodoy

Tente isso:

package view.tablemodel;

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

import javax.swing.table.DefaultTableModel;

import model.GerarRelatorio;

public class TableModelGerarArquivo extends DefaultTableModel{
	   
	   private static final long serialVersionUID = 1L;
	   public List<GerarRelatorio> vetor;
	   private int selecionado;
	   
	   public TableModelGerarArquivo(Map<Integer,GerarRelatorio> lista){		  
		   vetor = new ArrayList<GerarRelatorio>(lista.values());  
		   selecionado = -1;
	    }  
	
	   public int getColumnCount() {
		   return 4;
	   }   
	
	   public String getColumnName(int coluna) {    
	       switch(coluna){  
	         case  0:return "ITEM";  
	         case  1:return "INSTITUICAO";  
	         case  2:return "TIPO RELATORIO";  
	         case  3:return "ANO";  
	         default:return "";  
	       }  
	    }  
	   
	   public Object getValueAt(int linha, int coluna) {
		   
		   GerarRelatorio instituicaoControle = vetor.get(linha);  
	      switch(coluna){  
	         case  0:return selecionado == linha;
	         case  1:return instituicaoControle.getDS_INSTITUICAO();
	         case  2:return instituicaoControle.getDS_RELATORIO();  
	         case  3:return instituicaoControle.getNR_ANO();
	         default:return "";
	       }  
	   }  
	  
	   public Class<?> getColumnClass(int coluna) {  
		   switch(coluna){  
	       case  0:return Boolean.class;    
	       case  1:return String.class;  
	       case  2:return String.class;  
	       case  3:return Integer.class;  
	       default:return Object.class;  
	       }  
	    }
	
	    public int getRowCount() {  
	      return vetor.size();  
	    } 
	
	    public boolean isCellEditable(int linha, int coluna) {  
	    	return coluna == 0; 
	    }
	    
	     public void setValueAt(Object ob, int linha, int coluna) {  
	        if (coluna != 0 || !(ob instanceof Boolean)) {  
	            return;  
	        }  
	        selecionado = linha;
	     }
}

Para usa idéia, não seria melhor retornar um objeto do tipo GerarRelatorio diretamente?

Marky.Vasconcelos

Primeiro… extends AbstractTableModel. Não DefaulTableModel.

Voce pode criar um método getObject nesse TableModel que retorne o objeto na posicao indicada. Voce nao vai ter só o id mas o objeto inteiro.

Para o caso dos CheckBoxes… voce pode criar um ButtonGroup e adicionar todos lá… ele só permite que um seja selecionado. (Não sei se funciona pra CheckBoxes levei como base que funciona igual ao RadioButton)

Alchemist

cara sera que vc pode dar um exemplo de getObject ?

Marky.Vasconcelos

no seu TableModel faça um método assim.

public GerarRelatorio getObjectAt(int row){
return vetor.get(row);
}

Assim voce tem o objeto para trabalhar.

Alchemist

Cara valeu a dica mais eu n estou conseguindo :s olha o que eu fiz

package view.tablemodel;

import java.util.List;
import java.util.Vector;

import javax.swing.table.AbstractTableModel;

import model.Relatorio;

public class TableModelGerarArquivo extends AbstractTableModel{
	   
	   private static final long serialVersionUID = 1L;
	   private List<Relatorio> listaGerarRelatorio;  
	   public List<Relatorio> vetor;
	   private List<Boolean> booleans;
	   
	   public TableModelGerarArquivo(List<Relatorio> lista){
		  
		   this.listaGerarRelatorio = lista;  
		   vetor = new Vector<Relatorio>(listaGerarRelatorio);  
		   booleans = new Vector<Boolean>();  
	
		   for (int x = 0; x < vetor.size(); x++) {  
			   	booleans.add(false);  
		   } 
	    }  
	   
	   public int getColumnCount() {
		   return 4;
		 }   
	
	   public String getColumnName(int coluna) {    
	       switch(coluna){  
	         case  0:return "ITEM";  
	         case  1:return "INSTITUICAO";  
	         case  2:return "TIPO RELATORIO";  
	         case  3:return "ANO";  
	         default:return "";  
	       }  
	    }  
	   
	   public Object getValueAt(int linha, int coluna) {
		   
		   Relatorio instituicaoControle = vetor.get(linha);  
	      switch(coluna){  
	         case  0:return booleans.get(linha);  
	         case  1:return instituicaoControle.getDsInstituicao();
	         case  2:return instituicaoControle.getDsTipoRelatorio();  
	         case  3:return instituicaoControle.getNrAno();
	         default:return "";
	       }  
	   }  
	  
	   public Class<?> getColumnClass(int coluna) {  
		   switch(coluna){  
	       case  0:return Boolean.class;    
	       case  1:return String.class;  
	       case  2:return String.class;  
	       case  3:return Integer.class;  
	       default:return Object.class;  
	       }  
	    }
	
	    public int getRowCount() {  
	      return listaGerarRelatorio != null ? listaGerarRelatorio.size(): 0;  
	    } 
	
	    public boolean isCellEditable(int linha, int coluna) {  
	    	return coluna == 0; 
		}
	    
	    public void setValueAt(Object ob, int linha, int coluna) {  
	        if (coluna != 0 || !Boolean.class.isInstance(ob)) {  
	            return;  
	        }  
	        booleans.remove(linha);  
	        booleans.add(linha, (Boolean) ob);  
	     }
	     
	    public Relatorio getObjectAt(int row){  
	    	return vetor.get(row);  
	    }  

}

Eu mudei o nome da Classe sem problemas para Relatorio,

eu estou chamando o item assim

for (int i = 0; i < modeloGerarArquivo.getRowCount(); i++) {
     if (((Boolean)modeloGerarArquivo.getValueAt(i, 0)).booleanValue()?true:false){
                Relatorio teste21 = modeloGerarArquivo.getObjectAt(i);
                teste21.getIdInstituicaocontrole();
		    						
     }
}

Quando eu debugo dentro do TableModel que eu fiz ele esta retornando o objeto certinho porem n esta chegando até o “teste21”

:S alguma ideia ?

ViniGodoy

É impresão minha ou vc ignorou meu post?

Tem diversos detalhes ali que seu código simplesmente passa por cima.

  1. Não use Vector, use ArrayList;
  2. Elimine a variável listaGerarRelatorio, use só a variável vetor. Fica muito sujeito a erros e confuso você se basear em dois objetos distintos para fazer um model só. Usar a listaGerarRelatorio também viola o encapsulamento, já que seu usuário pode modificar essa lista por fora do model. Você também usa seu get baseado em vetor, mas seu size baseado na listaGerarRelatorio, o que é uma péssima prática;
  3. Se só um campo estará setado como true, não tem pq vc ter um vetor inteiro de booleans. Guarde só a linha que é true e pronto. Faça o model tratar o resto.
Alchemist

Vini muito obrigado pelas dicas, eu consegui utilizar o metodo que vc disse para inplementar.
E tentei arrumar com as outras dicas o meu codigo.

eu não consegui entender quando vc disse :

como eu faria isto ? Estou aprendendo agora a fazer um TableModel

Meu codigo ficou assim

package view.tablemodel;

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

import javax.swing.table.AbstractTableModel;

import model.Relatorio;

public class TableModelGerarArquivo extends AbstractTableModel{
	   
	   private static final long serialVersionUID = 1L;
	   public List<Relatorio> vetor;
	   private List<Boolean> booleans;
	   
	   public TableModelGerarArquivo(List<Relatorio> lista){
		  
		   this.vetor = lista;  
		   vetor = new ArrayList<Relatorio>(vetor);  
		   booleans = new ArrayList<Boolean>();  
	
		   for (int x = 0; x < vetor.size(); x++) {  
			   	booleans.add(false);  
		   } 
	    }  
	   
	   public int getColumnCount() {
		   return 4;
		 }   
	
	   public String getColumnName(int coluna) {    
	       switch(coluna){  
	         case  0:return "ITEM";  
	         case  1:return "INSTITUICAO";  
	         case  2:return "TIPO RELATORIO";  
	         case  3:return "ANO";  
	         default:return "";  
	       }  
	    }  
	   
	   public Object getValueAt(int linha, int coluna) {
		   
		   Relatorio instituicaoControle = vetor.get(linha);  
	      switch(coluna){  
	         case  0:return booleans.get(linha);  
	         case  1:return instituicaoControle.getDsInstituicao();
	         case  2:return instituicaoControle.getDsTipoRelatorio();  
	         case  3:return instituicaoControle.getNrAno();
	         default:return "";
	       }  
	   }  
	  
	   public Class<?> getColumnClass(int coluna) {  
		   switch(coluna){  
	       case  0:return Boolean.class;    
	       case  1:return String.class;  
	       case  2:return String.class;  
	       case  3:return Integer.class;  
	       default:return Object.class;  
	       }  
	    }
	
	    public int getRowCount() {  
	      return vetor != null ? vetor.size(): 0;  
	    } 
	
	    public boolean isCellEditable(int linha, int coluna) {  
	    	return coluna == 0; 
		}
	    
	    public void setValueAt(Object ob, int linha, int coluna) {  
	        if (coluna != 0 || !Boolean.class.isInstance(ob)) {  
	            return;  
	        }  
	        booleans.remove(linha);  
	        booleans.add(linha, (Boolean) ob);  
	     }
	     
	    public Relatorio getObjectAt(int row){  
	    	return vetor.get(row);  
	    }  

}

Eu tb ainda n arrumei um jeito de deixar para o usuario apenas um check para ele clicar, vc poderia me dar uma dica de como travar o resto ?

Valeu pela ajuda de verdade ^^

ViniGodoy

Faria igual eu fiz no model ali em cima… dá uma olhada lá que eu implementei essa dica.

Criado 2 de julho de 2009
Ultima resposta 3 de jul. de 2009
Respostas 9
Participantes 3