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.
