Descricao de Item no Jcombobox [RESOLVIDO]

No Jframe tenho um Jcombobox que no momento da insercao de dados tenho que salvar o codigo do item selecionado e na apresentacao mostrar a descricao dos itens.

Existe alguma forma de comparar o valor do codigo com a descricao e apresentar a descricao no jcombobox?

Preenchendo o Jcombobox


    public void listaTipodocumentoBox() throws Exception {

        try {

            TipoDocumentoDAO dao = new TipoDocumentoDAO();
            List<TipoDocumento> lista = dao.listarTipoDocumento();

            Iterator<TipoDocumento> it = lista.iterator();
            while (it.hasNext()) {

                TipoDocumento td = it.next();
                String tpdoc = td.getCd_tpdocumento();



                cbTipodocumento.addItem(tpdoc);

            }



        } catch (Exception ex) {
        }
    }

Gerando a lista

public ArrayList<TipoDocumento> listarTipoDocumento() throws SQLException {

        PreparedStatement stmt = connection.prepareStatement("select cd_tpdocumento, ds_tpdocumento from tpdocumento");

        ResultSet rs = stmt.executeQuery();

        ArrayList <TipoDocumento> listaTipodocumento = new ArrayList<TipoDocumento>();

        
        while(rs.next()) {
            TipoDocumento tpdoc;
            tpdoc = new TipoDocumento();
            tpdoc.setCd_tpdocumento(rs.getString("cd_tpdocumento"));
            tpdoc.setDs_tpdocumento(rs.getString("ds_tpdocumento"));
            listaTipodocumento.add(tpdoc);
 
        }
        
        return listaTipodocumento;


    }

Iniciando o combobox

  public CadastroDocumento() throws Exception {

        listaTipodocumentoBox();
       
    }

o mais recomendado no caso seria vc sobreescrever o método toString na classe TipoDocumento, assim vc enviaria o objeto TipoDocumento para o JComboBox, com os dados da classe junto e depois pegando eles de volta e fazer a sua checagem

ex:

acrescentar esse método ou a string que vc queira que mostre no jComboBox

public String toString(){ return getCd_tpdocumento(); }

como que seria acrescentado:

            while (it.hasNext()) {

                TipoDocumento td = it.next();
                cbTipodocumento.addItem(td);

            }

Dessa forma daria certo se na mesma tabela eu fosse salvar o codigo junto com a descricao, porem nessa tabela eu so vou salvar o codigo do item .

Teria uma outra forma?

Para setar o valor do item eu uso esse metodo:

doc.setCd_tpdocumento((String) cbTipodocumento.getSelectedItem());

???

Do jeito que mostrei vc envia o objeto, que no JComboBox irá mostrar apenas a String que irá ser obtida no método toString, não precisando colocar o id junto com a string de retorno, não entendi pq não funcionaria. Já que depois vc poderia apenas pegar o id dos objetos que vc queira salvar

Desculpe acho que nao entendi mesmo, :slight_smile: do jeito que voce falou achei que teria que salvar id junto com a string de retorno.

Como eu pegaria somente o cd_tpdocumento se eu seto o item no metodo:

doc.setCd_tpdocumento((String) cbTipodocumento.getSelectedItem());

no JComboBox, os items enviados para ele, usa o metodo toString para mostrar a string de retorno.

Se voce sobreescrever o método toString na sua classe do objeto (TipoDocumento) e mandar retornar o texto que vc queira (getCd_tpdocumento), no frame irá mostrar o getCd_tpdocumento de cada objeto, mas no jcombobox teria armazenado cada objeto (TipoDocumento), podendo ser recuperado quando voce queira.

tem como mostrar a classe TipoDocumento?

Segue a Classe TipoDocumento:

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

package sgd.modelo;

/**
 *
 * @author regis
 */
public class TipoDocumento {

    private String cd_tpdocumento;
    private String ds_tpdocumento;

    /**
     * @return the cd_tpdocumento
     */
    public String getCd_tpdocumento() {
        return cd_tpdocumento;
    }

    /**
     * @param cd_tpdocumento the cd_tpdocumento to set
     */
    public void setCd_tpdocumento(String cd_tpdocumento) {
        this.cd_tpdocumento = cd_tpdocumento;
    }

    /**
     * @return the ds_tpdocumento
     */
    public String getDs_tpdocumento() {
        return ds_tpdocumento;
    }

    /**
     * @param ds_tpdocumento the ds_tpdocumento to set
     */
    public void setDs_tpdocumento(String ds_tpdocumento) {
        this.ds_tpdocumento = ds_tpdocumento;
    }


}

hmm, curiosidade, vc queria então era comparar as strings para pegar o id?

exceto se vc queira fazer comparação de string (que podem haver dados com nomes iguais) para detectar o id do objeto, recomendo criar um campo id nessa classe. E adiciona na classe o método toString mostrado anteriormente.

Atualizar o dao para setar o id junto com o objeto e na classe de colocar os objetos no JComboBox, colocar o objeto TipoDocumento.

Dessa forma, depois vc pode pegar os objetos selecionados, e dar um get no id.

“Alguma” dúvida? :slight_smile:

Na verdade cd_tpdocumento eh o id do tipo de documento.
Para teste estou setando no jcombobox o cd_tpdocumento como uma String e ate o momento esta salvando normalmente, a intencao era no jcombobox apresentar o ds_tpdocumento(descricao) e salvar o cd_tpdocumento.

hmmmm, ok, então fica mais simples, vc pode alterar entao a classe tipodocumento para algo assim:

[code]
package sgd.modelo;

/**
*

  • @author regis
    */
    public class TipoDocumento {

    private String cd_tpdocumento;
    private String ds_tpdocumento;

    /**

    • @return the cd_tpdocumento
      */
      public String getCd_tpdocumento() {
      return cd_tpdocumento;
      }

    /**

    • @param cd_tpdocumento the cd_tpdocumento to set
      */
      public void setCd_tpdocumento(String cd_tpdocumento) {
      this.cd_tpdocumento = cd_tpdocumento;
      }

    /**

    • @return the ds_tpdocumento
      */
      public String getDs_tpdocumento() {
      return ds_tpdocumento;
      }

    /**

    • @param ds_tpdocumento the ds_tpdocumento to set
      */
      public void setDs_tpdocumento(String ds_tpdocumento) {
      this.ds_tpdocumento = ds_tpdocumento;
      }
      //Irá mostrar no jComboBox o texto que estiver aqui
      public String toString(){
      return ds_tpdocumento;
      }
      }[/code]

e pra instanciar o jcombobox vc soh precisa alterar aquele código seu:

[code]
public void listaTipodocumentoBox() throws Exception {
try {
TipoDocumentoDAO dao = new TipoDocumentoDAO();
List lista = dao.listarTipoDocumento();
Iterator it = lista.iterator();
while (it.hasNext()) {

            TipoDocumento td = it.next();
            cbTipodocumento.addItem(td);
        }
    } catch (Exception ex) {
    }
}[/code]

e para pegar o objeto de volta, seria isso:

TipoDocumento tp = (TipoDocumento) cbTipodocumento.getSelectedItem();

com isso, vc teria o TipoDocumento de volta, e poderia fazer o que quiser com ele

Alterei dessa forma porem quando mando inserir, da um erro informando que coluna cd_tpdocumento nao aceita valor null, ou seja:

TipoDocumento tp = (TipoDocumento) cbTipodocumento.getSelectedItem();

Nao esta retornando o cd_tpdocumento para ser inserido na tabela.

os códigos que te passei não alterariam o valor do cd_tpdocumento, tem como me mostrar os códigos alterados do primeiro tópico?

Segue as classes modificadas.

Modelo:


public class TipoDocumento {

    private String cd_tpdocumento;
    private String ds_tpdocumento;
    


    /**
     * @return the cd_tpdocumento
     */
    public String getCd_tpdocumento() {
        return cd_tpdocumento;
    }

    /**
     * @param cd_tpdocumento the cd_tpdocumento to set
     */
    public void setCd_tpdocumento(String cd_tpdocumento) {
        this.cd_tpdocumento = cd_tpdocumento;
    }

    /**
     * @return the ds_tpdocumento
     */
    public String getDs_tpdocumento() {
        return ds_tpdocumento;
    }

    /**
     * @param ds_tpdocumento the ds_tpdocumento to set
     */
    public void setDs_tpdocumento(String ds_tpdocumento) {
        this.ds_tpdocumento = ds_tpdocumento;
    }

    public String toString(){
        return ds_tpdocumento;
    }

}

Lista:

 public ArrayList<TipoDocumento> listarTipoDocumento() throws SQLException {

        PreparedStatement stmt = connection.prepareStatement("select cd_tpdocumento, ds_tpdocumento from tpdocumento");

        ResultSet rs = stmt.executeQuery();

        ArrayList <TipoDocumento> listaTipodocumento = new ArrayList<TipoDocumento>();

        
        
        while(rs.next()) {
            TipoDocumento tpdoc;
            
            tpdoc = new TipoDocumento();
            tpdoc.setCd_tpdocumento(rs.getString("cd_tpdocumento"));
            tpdoc.setDs_tpdocumento(rs.getString("ds_tpdocumento"));
            
            
            listaTipodocumento.add(tpdoc);
 
        }
        
        return listaTipodocumento;


    }

Jcombobox:

public void listaTipodocumentoBox() throws Exception {

        try {

            TipoDocumentoDAO dao = new TipoDocumentoDAO();
            List<TipoDocumento> lista = dao.listarTipoDocumento();

            Iterator<TipoDocumento> it = lista.iterator();
            while (it.hasNext()) {

                TipoDocumento td = it.next();
                //String tpdoc = td.getCd_tpdocumento();

                cbTipodocumento.addItem(td);

                

            }

        } catch (Exception ex) {
        }
    }

ActionListener

TipoDocumento tp = (TipoDocumento)cbTipodocumento.getSelectedItem();

Erro quando mando salvar:

SEVERE: null
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'cd_tpdocumento' cannot be null

Nao estava sabendo usar o metodo para pegar o cd_tpdocumento.

String tp = ((TipoDocumento)cbTipodocumento.getSelectedItem()).getCd_tpdocumento();
            doc.setCd_tpdocumento(tp);