JcomboBox pega nome e JtextField retorna id

Boa noite galera estou estou precisando de uma imensa ajuda de vocês
que estou tentando solucionar já algum tempo

estou com uma combobox que recebe o nome do cliente
e fiz um ActionListener para que esse pegue o id do cliente

segue meu código abaixo .:

public void carregarComboCliente(){  
   ClienteDAO dao = new ClienteDAO();  
   ArrayList<tblCliente> cliente = new ArrayList<tblCliente>(dao.getListaClientes()); 
//   ComboBoxCliente.addItem("--Seleciona--");  
   ComboBoxCliente.addItem(new String(""));    
   for (tblCliente listacliente: cliente)  {
//      DefaultComboBoxModel cbox =(DefaultComboBoxModel)ComboBoxCliente.getModel();    
     ComboBoxCliente.addItem(listacliente); 
      System.out.println(listacliente.toString());
              }

   ComboBoxCliente.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent evt) {         
         tblCliente p = (tblCliente)ComboBoxCliente.getSelectedItem();         
         txtCodCliente.setText(String.valueOf(p.getClientePCod()));        
      }
   }
           );
           }

Segui as orientações do seguinte Tópico
http://www.guj.com.br/java/146786-jcombobox-e-jtextfield

Mais ao clicar no Combobox se passa o seguinte erro

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to CLASSES.tblCliente at TELAS.COMPR$3.actionPerformed(COMPR.java:230)

Ao mudar o

Para

em vez dos nomes dos clientes aparece a “relação da classe” assim

CLASSES.tblCliente@578ceb
CLASSES.tblCliente@1e4cbc4
CLASSES.tblCliente@1fdc96c

mais o jtextfield mostra o id do cliente normalmente

Boa noite Lucas.

Possívelmente o erro está nesta linha aqui.

   .....
   tblCliente p = (tblCliente)ComboBoxCliente.getSelectedItem();  
   ....

Isto porque o erro reportado é um erro de casting ou seja, voce está tentando converter um tipo de classe para um tipo que não está na sua linha hierárquica de herança e dai o erro abaixo:


Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to CLASSES.tblCliente  
    at TELAS.COMPR$3.actionPerformed(COMPR.java:230) 

Trocando em miúdos, o método "getSelectedItem() do ComboBox, não retorna um objeto do tipo tblCliente e sim deve retornar um tipo de objeto String, dai o erro de casting, se você fizesse assim:

   .....
   String p = (String)ComboBoxCliente.getSelectedItem();  
   ....

Talvez o erro não dispararia, porém não sei se resolveria o seu caso. Digo isto porque o melhor que você tenha a fazer, em se tratando de preencher uma lista de um ComboBox, com dados do banco, é criar uma classe que implementa “ComboBoxModel”, vamos a um exemplo:

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataListener;

public class DBComboModel implements ComboBoxModel {
    private ArrayList&lt;String&gt; data = null;
    private String selected_item = null;
    private int index;
    
    public DBComboModel(String column, String sql){
        try {
            data = new ArrayList&lt;String&gt;();

            //Esse select deve trazer apenas uma coluna para facilitar.(coluna q vai no Combobox)
            Class driver = Class.forName("org.postgresql.Driver");
            String banco = "jdbc:postgresql://localhost:5432/AGENDA";
            DriverManager.registerDriver((Driver)driver.newInstance());
            Connection conn = DriverManager.getConnection(banco,"postgres","masterkey");
            conn.setAutoCommit(true);

            PreparedStatement stm = conn.prepareStatement(sql);                          
            ResultSet rs = stm.executeQuery();       
            
            data.add("...");
            while(rs.next()){
                data.add(rs.getString(column)); //adiciona no arraylist todos os itens selecionados
            } 
            //tenta selecionar o primeiro item do array                             
            selected_item = data.get(0);                        
        }catch(Exception e){       
            e.printStackTrace();                       
            //trate sua exceção       
        }
    }

    public int getSelectedIndex(){
        return index;
    }

    public void setSelectedIndex(int anIndex){
        this.index = anIndex;
    }

    @Override
    public void setSelectedItem(Object anItem) {
        String item = (String)anItem;
        selected_item = data.get(data.indexOf(item));
        setSelectedIndex(data.indexOf(item));
    }

    @Override
    public Object getSelectedItem() {
        return selected_item;
    }

    @Override
    public int getSize() {
        return data.size();
    }

    @Override
    public Object getElementAt(int index) {
        return data.get(index);
    }

    @Override
    public void addListDataListener(ListDataListener l) {
        // Método não utilizado.
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
        // Método não utilizado.
    }

}

Pronto, agora vamos atribuir essa classe ao seu ComboBox, assim:

   ....
   comboboxcliente = new JComboBox(new DBComboModel("NomeCliente","Select NomeCliente From Cliente Order By NomeCliente"));
   ....

Repare que com essa “ComboBoxModel”, voce apanha dados diretamente do banco, para preencher a lista do ComboBox, com uma instrução SQL, e ainda por cima, criou um Model genérico para diversos ComboBoxes, bastando tão somente mudar o nome do campo que vai preencher a lista e a instrução SQL. Muito melhor do que fazer persistência de dados em vários ArrayList para depois preencher um ComboBox, não é mesmo.

Agora quando voce clicar em um item do JComboBox, vamos preencher o JTextField, para isto temos que disparar um evento do JComboBox chamado “ItemListener”, que quando um item for selecionado ele tem que preencher o JTextField, então vejamos:

    ....
   comboboxcliente = new JComboBox(new DBComboModel("NomeCliente","Select NomeCliente From Cliente Order By NomeCliente"));
   comboboxcliente.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                 txtNomeCliente.setText((String)e.getItem());
                 
                 // Ou se preferir, também pode ser assim:
                 JComboBox combocliente = (JComboBox)e.getSource();
                 txtNomeCliente.setText((String)combocliente.getSelectedItem());
            }
    });

Um abraço

discorpio segui suas dicas me ajudaram muito , principalmente na construção da classe da combobox
que vai me ajudar a reduzir “algumas” consultas sql rsrsrs…

Mais só que não estou conseguindo receber a consulta , segue meu codigo

Classe DBComboModel


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package TELAS;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement; 
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataListener;

/**
 *
 * @author usuario
 */
public class DBComboModel implements ComboBoxModel {
    private ArrayList<String> data = null;
    private String selected_item = null;
    private int index;
    
   public DBComboModel(String column, String sql){
        try {
            data = new ArrayList<String>();
            //Esse select deve trazer apenas uma coluna para facilitar.(coluna q vai no Combobox)
            String banco = "jdbc:mysql://localhost:3306/mad";
            Connection conn = DriverManager.getConnection(banco,"root","");
            conn.setAutoCommit(true);
            PreparedStatement stm = (PreparedStatement) conn.prepareStatement(sql);                          
            ResultSet rs = stm.executeQuery();       
            
            data.add("...");
            while(rs.next()){
                data.add(rs.getString(column)); //adiciona no arraylist todos os itens selecionados
            } 
            //tenta selecionar o primeiro item do array                             
            selected_item = data.get(0);             
        }catch(Exception e){       
            e.printStackTrace();                       
            //trate sua exceção       
        }
    }

    public int getSelectedIndex(){
        return index;
    }

    public void setSelectedIndex(int anIndex){
        this.index = anIndex;
    }

    @Override
    public void setSelectedItem(Object anItem) {
        String item = (String)anItem;
        selected_item = data.get(data.indexOf(item));
        setSelectedIndex(data.indexOf(item));
    }

    @Override
    public Object getSelectedItem() {
        return selected_item;
    }

    @Override
    public int getSize() {
        return data.size();
    }

    @Override
    public Object getElementAt(int index) {
        return data.get(index);
    }

    @Override
    public void addListDataListener(ListDataListener l) {
        // Método não utilizado.
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
        // Método não utilizado.
    }

}

Estou atribuindo aqui

private void ComboBoxClienteActionPerformed(java.awt.event.ActionEvent evt) {                                                
// TODO add your handling code here:
     ComboBoxCliente = new JComboBox(new DBComboModel("ClientePNome", "Select * From tbl_client Order By `ClientePNome`"));
}   

Só que não está retornando nada nenhum erro também =/

Ao invés de colocar apenas uma coluna no combobox, coloque um objeto cliente inteiro.

O combobox tem a incrível capacidade de trabalhar com objetos, não só com Strings, use-a. :wink:

Além disso, abra tópicos sobre interface gráfica no fórum de interface gráfica.

Boa noite Lucas.

Em primeiro lugar, retire as aspas simples logo após a sintaxe SQL “Order By ‘ClientePNome’”, visto que “ClientePNome”, presumo eu, é um nome de campo dentro da sua tabela e não um dado.

Em segundo lugar, procure selecionar uma sintaxe SQL que traga no máximo dois campos, visto que você não vai utilizar todos os campos da tabela dentro do JComboBox, vai :?: Logo traga somente os campos ID do Cliente e o seu Nome, assim:

   ComboBoxCliente = new JComboBox(new DBComboModel("ClientePNome", "Select id_Cliente, ClientePNome From tbl_client Order By ClientePNome"));

Em terceiro lugar, você não precisa fazer casting de PreparedStatement de um método que já retorna um PreparedStatement, assim sendo corrija:

     // Troque:
     PreparedStatement stm = (PreparedStatement) conn.prepareStatement(sql);

     //Por:
     PreparedStatement stm = conn.prepareStatement(sql);

Um abraço