Problema não identificado

Galera, to cum problema e num to conseguindo detectar onde que ele se encontra. Vou coloca os códigos e o erro:

ERRO: Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: sistemaproduto.modelo.dominio.constante.UnidadeVenda cannot be cast to java.lang.String
at sistemaproduto.interfacegrafica.TelaDadosProduto.getProduto(TelaDadosProduto.java:37)
at sistemaproduto.interfacegrafica.OuvinteDeTelaDadosProduto$OuvinteGravarProduto.actionPerformed(OuvinteDeTelaDadosProduto.java:24)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
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)

CÓDIGO

[code]//…
public Produto getProduto() throws ClasseDeExcecao {
String nome = tfNome.getText();
if (nome == null || nome.trim().equals("")) {
tfNome.requestFocus();
throw new ClasseDeExcecao(“Não foi informado o nome do produto.”);
} else {
produto.setNome(nome);
}

    produto.setQuantidade(Integer.parseInt(this.tfQuantidade.getText()));

   String unidadeVenda = (String) cbUnidadeVenda.getSelectedItem();
    if (unidadeVenda.trim().equals("")) {
        throw new ClasseDeExcecao("Não foi informada a unidade de venda do produto.");
    } else {
        produto.setUnidadeVenda(unidadeVenda);
    }

…[/code]

Classe VO

[code] //…
private String UnidadeVenda;

public String getUnidadeVenda() {
    return UnidadeVenda;
}

public void setUnidadeVenda(String UnidadeVenda) throws ClasseDeExcecao {
    if(UnidadeVenda==null || UnidadeVenda.length()==0){
        throw new ClasseDeExcecao("Unidade de venda não informada");
    }
    this.UnidadeVenda = UnidadeVenda;
}

//…[/code]

Select

[code]//…
private static final String SQL_INCLUIR =
"INSERT INTO produto (codigoproduto, nome, quantidade, unidadeVenda, valorUnitario, valorTotal, dataCompra) "
+ “VALUES (?, ?, ?, ?, ?, ?, ?)”;
private static final String SQL_ALTERAR =
“UPDATE produto SET nome = ?, quantidade = ?, unidadeVenda = ?, valorUnitario = ?, valorTotal = ?, dataCompra = ? WHERE codigoproduto = ?”;

//…[/code]

criar, insere, altera e grava

[code]//…
private Produto criarProduto(ResultSet rs) throws ClasseDeExcecao {
Produto produto = new Produto();
try {
produto.setCodigo(rs.getLong(“codigoproduto”));
produto.setNome(rs.getString(“nome”));
produto.setQuantidade(rs.getInt(“quantidade”));
produto.setUnidadeVenda(rs.getString(“unidadeVenda”));
produto.setValorUnitario(rs.getDouble(“valorUnitario”));
produto.setValorTotal(rs.getDouble(“valorTotal”));
produto.setDataCompra(rs.getDate(“dataCompra”));
} catch (SQLException exc) {
StringBuffer mensagem = new StringBuffer(“Não foi possível obter os dados do produto.”
+ " Por favor, entre em contato com o administrador do sistema.");
mensagem.append("\nMotivo: ").append(exc.getMessage());
throw new ClasseDeExcecao(mensagem.toString());
}
return produto;
}

private void incluirProduto(Produto produto) throws ClasseDeExcecao, SQLException {
    if (produto == null) {
        String mensagem = "Não foi informado o produto a ser cadastrado.";
        throw new ClasseDeExcecao(mensagem);
    }
    Connection con = null;
    PreparedStatement stmt = null;
    try {
        con = GerenciadorDeConexao.getConexao();
        stmt = (PreparedStatement) con.prepareStatement(SQL_INCLUIR);
        GeradorDeChave geradorDeChave = new GeradorDeChave("produto");
        long codigoproduto = geradorDeChave.getProximoCodigo();
        stmt.setLong(1, codigoproduto);
        stmt.setString(2, produto.getNome());
        stmt.setInt(3, produto.getQuantidade());
        stmt.setString(4, produto.getUnidadeVenda());
        stmt.setDouble(5, produto.getValorUnitario());
        stmt.setDouble(6, produto.getValorTotal());
        java.util.Date datacompra = produto.getDataCompra();
        stmt.setDate(7, new java.sql.Date(datacompra.getTime()));
        stmt.executeUpdate();
    } catch (SQLException exc) {
        StringBuffer msg = new StringBuffer("Não foi possível incluir o produto. "
                + "Por favor, tente novamente.\n\n\n Se o erro persistir, contate"
                + " o administrador do sistema.");
        msg.append("\nMotivo do erro: ").append(exc.getMessage());
        throw new ClasseDeExcecao(msg.toString());
    } finally {
        GerenciadorDeConexao.closeConexao(con, stmt);
    }
}

private void alterarProduto(Produto produto) throws ClasseDeExcecao {
    if (produto == null) {
        String mensagem = "Não foi informado o produto a ser alterado.";
        throw new ClasseDeExcecao(mensagem);
    }
    Connection con = null;
    PreparedStatement stmt = null;
    try {
        con = GerenciadorDeConexao.getConexao();
        stmt = (PreparedStatement) con.prepareStatement(SQL_ALTERAR);
        stmt.setString(1, produto.getNome());
        stmt.setInt(2, produto.getQuantidade());
        stmt.setString(4, produto.getUnidadeVenda());
        stmt.setDouble(5, produto.getValorUnitario());
        stmt.setDouble(6, produto.getValorTotal());
        java.util.Date datacompra = produto.getDataCompra();
        stmt.setDate(7, new java.sql.Date(datacompra.getTime()));
        stmt.setLong(8, produto.getCodigo());
        stmt.executeUpdate();
    } catch (SQLException exc) {
        StringBuffer msg = new StringBuffer("Não foi possível atualizar os dados do produto. "
                + "Por favor, tente novamente.\n\n\n Se o erro persistir, contate o administrador do sistema.");
        msg.append("\nMotivo do erro: ").append(exc.getMessage());
        throw new ClasseDeExcecao(msg.toString());
    } finally {
        GerenciadorDeConexao.closeConexao(con, stmt);
    }
}

public void gravarProduto(Produto produto) throws ClasseDeExcecao {
    if (produto.getCodigo() == ConstanteProduto.NOVO) {
        try {
            incluirProduto(produto);
        } catch (SQLException ex) {
            Logger.getLogger(GatewayProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
    } else {
        alterarProduto(produto);
    }
}[/code]

Ae,
Note o erro:

ERRO: Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: sistemaproduto.modelo.dominio.constante.UnidadeVenda cannot be cast to java.lang.String

Você tentar jogar uma variável do tipo da sua classe de domínio para uma String, mas jogar, não converter o conteúdo.

Para converter você pode:

  • usar o String.valueOf(Object seuObjeto) ,metódo estático…
  • Chamar o método toString do seu objeto (mas deverá sobreescrever esse método na classe de domínio, pesquise mais sobre ele e tals…
  • [Feio] tentar concatenar o seu objeto com uma String, por exemplo:

[code]
String s = objeto + “”;

[/code][/Feio];

Acredito que o erro seu deve estar acontecendo nessa linha:

String unidadeVenda = (String) cbUnidadeVenda.getSelectedItem(); 

Fiz um pequeno laboratório para mostrar o que escrevi ai em cima:

public class Test{
	public static void main(String args[]){
		Cl1 cl = new Cl1();
		//ClassCastException ou Incovertible types em tempo de compilação!
		//String s1 = (String) cl;
		
		//funciona \o/
		String s2 = String.valueOf(cl);
		
		//funciona, mas lança NullPointerException se cl for nulo (em tempo de execução)! 
		String s3 = cl.toString();
		
		//FEIO!
		String s4 = cl +  "";
		System.out.println(s2);System.out.println(s3);System.out.println(s4);
	}
	
	public static class Cl1{
		public String toString(){
			//O famoso toString: você pode retornar parâmetros aqui ou qq coisa que quiser ^^
			return "Hey!!!11!!11";
		}
		
	}
}

Cara, o que você falou funcionou. Porém, agora eu fiquei com uma pulga atrás da orelha, pois usei esse tipo de cast (exemplo: String variavel = (String) cbCategoriaCliente.getSelectItem():wink: em outro JComboBox que tenho e não deu esse problema. Segue o código:

public Cliente getcliente() throws ClasseDeExcecao { String categoria = (String) cbCategoria.getSelectedItem(); if (categoria.trim().equals("")) { throw new ClasseDeExcecao("Não foi informada a categoria do cliente."); } else { cliente.setCategoria(categoria); }

Alguém poderia me dizer porque um funcinou e o outro não?

AH, só para ficar mais claro, eu estou alimentandos os JComboBox com enum.
Segue as enum’s:

public enum CategoriaDeCliente { Vendedora, Administrador }

public enum UnidadeVenda { Caixa, Pacote, Unidade }

A grande pergunta é como você alimentou as Combo Box.

O getSelectedItem retorna a referência do objeto que você coloca lá, ele não mexe no seu objeto.

Você não deve ter preenchido com Enum, pois Enum dá o erro de tipos incompatíveis:

public class EnumString{
    public static void main(String main[]){
        Numeros a = Numeros.um;
        //Tipos incompatíveis
	String s = (String) a;
    }
    public static enum Numeros{
        um, dois, tres;
    }
}

Posta como você preenche as JComboBox!

Jesuino Master, fiz dessa forma:

usei as enum’s, dai no construtor da minha classe (onde se encontra os JComboBox) eu coloquei um for para pegar os valores das enum’s. Segue o código abaixo:

//UNIDADE DE VENDA

for (UnidadeVenda unidadeVenda: UnidadeVenda.values()){ cbUnidadeVenda.addItem(unidadeVenda.name()); }

//CATEGORIA DO CLIENTE

for(CategoriaDeCliente categoria: CategoriaDeCliente.values()) { cbCategoria.addItem(categoria.name()); }

No combo categoriaCliente não deu nenhum problema do cast que eu fiz, agora no de unidadeVenda deu aquele erro mencionado na primeira postagem.

Realmente está estranho, pois você está adicionando o valor String do Enum e não o Enum em sí.

deixa pra lá, eu usei o String.valueof(cbUnidadeVenda.getSelectedItem():wink: e deu certo. Vai entender né?..