CheckBox na JTable [RESOLVIDO]

Boa tarde pessoal,

Estou tentando colcocar uma checkBox dentro da minha JTable a partir do meu TabelModel, mas não consigo de maneira alguma, retorna sempre o valor true ou false, uo gera erro. Segue o código:

package jtables;

import funcionario.model.Funcionario;
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class FuncionarioTableModel extends AbstractTableModel {

    private List<Funcionario> funcionarios = new ArrayList<Funcionario>();

    public void setFuncionarios(List<Funcionario> f) {
        this.funcionarios = f;
    }

    @Override
   public Class getColumnClass(int columnIndex) {
                return Boolean.class; 
            }
    
    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public String getColumnName(int col) {
        switch (col) {
            case 0:
                return "Nome";
            case 1:
                return "Idade";
            case 2:
                return "Convenio";
            default:
                return null;
        }
    }

    @Override
    public int getRowCount() {
        return funcionarios != null
                ? funcionarios.size()
                : 0;
    }
    
    @Override
    public Object getValueAt(int lin, int col) {
        if (funcionarios != null && lin >= 0 && lin < funcionarios.size()) {
            Funcionario f = funcionarios.get(lin);
            switch (col) {
                case 0:
                    return f.getNome();
                case 1:
                    return f.getIdade();
                case 2:
                    return getColumnClass(2);
                case 3:
                    return null;
            }
        }
        if (col == 1){
            
        }
        return null;
    }
}

erro:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
	at javax.swing.plaf.synth.SynthTableUI$SynthBooleanTableCellRenderer.getTableCellRendererComponent(SynthTableUI.java:667)
	at javax.swing.JTable.prepareRenderer(JTable.java:5720)
	at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:624)
	at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:521)
	at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:305)
	at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:234)
	at javax.swing.JComponent.paintComponent(JComponent.java:752)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
	at javax.swing.JComponent.paint(JComponent.java:1015)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
	at java.awt.Container.paint(Container.java:1778)
	at java.awt.Window.paint(Window.java:3379)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:797)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:694)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:41)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1636)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:607)
	at java.awt.EventQueue$1.run(EventQueue.java:605)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:616)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 7 segundos)

Obrigado desde já.

Acho q não fui mto claro quando expus minha dúvida, tentar explicar melhor:

Quero colocar uma checkBox a partir do método getValueAt(). Já li que retornando null e setando true ou false dá certo, mas não to conseguindo ainda, se alguem puder dar alguma dica, link, qlq coisa, agradeço mto.

Abração.

O seu getColumnClass() deve retornar a classe de cada coluna. Faz um IF verificando o índice da coluna e retorne corretamente (String, int e Boolean, acredito).

E ali no getValueAt(), no case 2, retorne um isAlgumaCoisa, que é um atributo do teu objeto funcionário (?).

Espero ter ajudado!

PS: Dá um break ali nos cases.

Boa tarde a todos.

Pelo que pude perceber o erro está aqui.

   @Override  
   public Class getColumnClass(int columnIndex) {  
                return Boolean.class;   
   }

Isto está fazendo com que você retorne dados booleanos em todos as colunas, e dai o erro de casting reportado na Exceção.

     Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean 
     .....
     .....

Ou seja todas as outras colunas não são booleanas. O código certo é você especificar qual a coluna que você retorne booleano, assim:

  @Override
    public Class getColumnClass(int column){
        if (column==0){
            return Integer.class;
        } else if (column==6) {
            return Boolean.class;
        } else {
            return String.class;
        }
    }

No caso acima, a coluna 0 formatará um dado tipo Integer, a coluna 6, um dado booleano, e as demais, dados do tipo String.

Um abraço.

discorpio,

Era exatamente isso, mto obrigado pela sua grande ajuda, Deus te abençoe.
Ainda estou dando meus primeiros passos no Swing, e como sempre o GUJ e seus membros tem dado grande ajuda.

Novamente mto obrigado, e um grande abraço.

Bom dia a todos.

[quote=$ERVER]discorpio,

Era exatamente isso, mto obrigado pela sua grande ajuda, Deus te abençoe.
Ainda estou dando meus primeiros passos no Swing, e como sempre o GUJ e seus membros tem dado grande ajuda.

Novamente mto obrigado, e um grande abraço.
[/quote]

Só te peço duas coisas:

1º) Agradeça também ao nosso amigo Fasts que foi ele quem dectetou este erro primeiro.

2º) Não se esqueça de colocar [RESOLVIDO] no teu post inicial.

Um abraço.

fasts,

Primeiro, quero pedir desculpas: o sono ontem acabou me deixando passar batido, e nem agradeci. Mto obrigado pela ajuda, Deus te abençoe.

Um grande abraço a todos.

[quote=fasts]O seu getColumnClass() deve retornar a classe de cada coluna. Faz um IF verificando o índice da coluna e retorne corretamente (String, int e Boolean, acredito).

E ali no getValueAt(), no case 2, retorne um isAlgumaCoisa, que é um atributo do teu objeto funcionário (?).

Espero ter ajudado!

PS: Dá um break ali nos cases.[/quote]

Amigo, pode me dar uma ajuda?

estou com o mesmo problema… coloco mais não aparece a check box na tabela…

public Class<?> getColumnClass(int coluna) {
		switch (coluna) {
		case 0:
			return Object.class; 
		case 1:
			return Object.class; 
		case 2:
			return Boolean.class; 
		default:
			return Object.class; 
		}
	}

e para pegar o valor…


public Object getValueAt(int linha, int coluna) {
		PermissoesGET c = permissoes.get(linha);

		switch (coluna) {
		case 0:
			return c.getId(); 
		case 1:
			return c.getDescricao(); 
		case 2:
			return c.isAcesso();
		default:
			return null; 
		}
	}

e para setar o valor…


	public void setValueAt(Object valor, int linha, int coluna) {
		PermissoesGET c = permissoes.get(linha);

		switch (coluna) {
		case 0:
			c.setId((Integer)valor); 
			break;
		case 1:
			c.setDescricao(valor.toString()); 
			break;
		case 2:
			c.setAcesso(new Boolean((Boolean) valor)); 
			break;
		}
		fireTableDataChanged();
	}


-------------



DAO com conexão para setar o valor..

	public static PermissoesGET getUsuarios(ResultSet rs) throws SQLException {
		PermissoesGET c = new PermissoesGET();
		try {
			c.setId(rs.getInt("id"));
			c.setDescricao(rs.getString("descricao"));
			c.setAcesso(false);
		} catch (SQLException e) {
			throw new SQLException("Não foi possivel setar os valores para a lista!",
					e);
		}
		return c;
	}

pode me ajudar??

Não sei o que está errado…

Ah, é desnecessário o “new Boolean”.
Deixe só ((Boolean) valor)…

[quote=fasts]Não sei o que está errado…

Ah, é desnecessário o “new Boolean”.
Deixe só ((Boolean) valor)…[/quote]

obrigado cara…

mesmo assim, fiz a modificação que voce indicou, e ñ aconteceu nada… mais vlw pela ajuda!