Erro ao pegar código da jComboBox

4 respostas
marcosarantesj

A excessão é essa, que indica que não pode converter para a classe.

Já fiz os testes e percebi que quando preenche com os objetos, ele pega os valores, mas quando é setado um valor, ele não pega o código ao salvar, somente se eu seleciona na jComboBox novamente é que ele consegue pegar e mostrar que está selecionado. Isso é estranho. Nunca tive esse problema, só estou tendo agora porque estou usando melhores práticas agora com ArrayList nas classes mesmo. Está tudo implementado de forma correta. Vou passar a classe. Sempre procuro fazer da melhor maneira para melhorar a performance e aprendi muito aqui com o pessoal, porque na faculdade só aprendi o básico, mas já programo a um tempo.

package Classes2;

import java.util.ArrayList;
import java.util.List;
import login.Classes.DB;
import login.Classes.Query;

/**
 *
 * @author MARK
 */
public class UF {

    private int codigo;
    private String descricao;

// Getters(pega um valor) e Setters(seta um valor)
    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
//===================================================
//construtor com os campos

    public UF(int codigo, String descricao) {
        this.codigo = codigo;
        this.descricao = descricao;
    }

////Construtor vazio
    public UF() {
    }

    @Override
    public String toString() {
        return getDescricao();
    }

    //Carrega todos os dados em um ArrayList para preencher a jCombo
    public List<UF> carregar() {
        DB banco = new DB();
        banco.connect();
        Query carregaUf = new Query(banco.conn);
        //==================================================================
        carregaUf.open("SELECT iduf,descricao FROM uf");
        //==================================================================
        String iduf, descricaoUf;
        //==================================================================
        //Classe instanciada
        UF uf = new UF();
        //====================================================================
        //ArrayList
        List<UF> vuf = new ArrayList();
        //====================================================================
        while (carregaUf.next()) {
            iduf = carregaUf.fieldbyname("iduf");
            descricaoUf = carregaUf.fieldbyname("descricao");

            uf.setCodigo(Integer.parseInt(iduf));
            uf.setDescricao(descricaoUf);

            //Carrega os dados no ArrayList
            vuf.add(new UF(uf.getCodigo(), uf.getDescricao()));
        }
        banco.disconnect();
        return vuf;


    }
}

Essa classe está OK. Já testei.
Agora para carregar na jComboBox. também está tudo certo.

private void formInternalFrameOpened(javax.swing.event.InternalFrameEvent evt) {                                         
            for (UF uf : new UF().carregar()) {
            cbUf.addItem(uf);
        }
}

Agora vem o problema. Se eu selecionar uma linha na jTable e retornar os valores, ele preenche todos os controles corretamente. Preenche a jCombo também, mas quando eu vou editar algum campo, sem selecionar outra UF na jComboBox e depois clicar em salvar, ele mostra como se o cbUf não estivesse selecionado e por isso dá a excessão. Quero lembrar a todos que uso TableModel com filtro, não precisam se preocupar, mas meu erro é somente esse. Se na validação antes de salvar eu colocar. Para selecionar a descricao na cbUf, eu usei:

if (jTable1.getRowCount() > 0 && jTable1.getSelectedRow() > -1) {
            String[] linha = (String[]) model.getLinhas().get(jTable1.getSelectedRow());
 cbUf.getModel().setSelectedItem(linha[0]);
}
if(cbUf.getSelectedIndex()==-1){
 JOptionPane.showMessageDialog(null, "Selecione a categoria","Aviso",JOptionPane.WARNING_MESSAGE);
}

Ele sempre vai ter índice -1, mesmo se estiver mostrando alguma UF, devido não ter selecionado novamente. Deve ser o fato dele preencher usando o model na Combo que deve estar dando problema. Como posso corrigir isso? Eu poderia mudar a maneira de setar o valor no jCombo, lembrando que já tentei setar tirando o getModel(), mas não pega. Tentei assim:

cbUf.setSelectedItem(linha[0]);

Mas não pega se não pegar o modelo, mas pegar o modelo, quando vou salvar dá como se não tivesse selecionado nada, mesmo estando lá o valor na Combo.

4 Respostas

Adelar

O problema é que você está passando um parâmetro que é String num ponto que deve ser uma classe UF. Envie novamente a exception que fica mais fácil verificar por ela.

[]'s

marcosarantesj

Vou amanhã de manhã, só lembrando que a exception geral dá a mesma mensagem. Já fiz isso. Só que coloquei Exception normal. Qual a maneira que você seta o nome selecionado na jComboBox? Talvez seja isso e aí não está conseguindo pegar.

marcosarantesj

Descobri agora, mexendo mesmo. Como faço um loop para preencher, tenho que fazer o mesmo para procurar na jComboBox e então setar a classe instanciada e não o valor de uma só vez. Ficou assim:

for(UF uf:new UF().carregar()){
     if(uf.getDescricao().equals(linha[0])){
     cbUf.getModel().setSelectedItem(uf);
     }
 }

Agora ele recebe o valor do código e descrição porque estou setando a classe toda. Eu faço a comparação para verificar se existe aquela descricao mesmo.

Adelar

Li a mensagem, mas acabei esquecendo de responder. Legal que deu certo :smiley:

Att.

Criado 9 de março de 2011
Ultima resposta 12 de mar. de 2011
Respostas 4
Participantes 2