JComboBox tem ID?

9 respostas
ericmaicon

Olá galera, tudo bem?
Bom Dia!

estou iniciando em java, tenho alguns costumes diferentes pois sou programador PHP tem mais de 5 anos…ai fica um pouco dificil…porém vamos à minha dúvida:

eu criei um JComboBox e enviei o valor para ele do BD, porém como vou relacionar o Valor selecionado com o Valor do ID no registro do BD?

Tipo assim:
mandei mostrar nele o registro:
ID - NOME
1 - casa
3 - apto
5 - sitio
8 - fazenda

porém eu mandei mostrar só o nome, como que faço para inserir no BD o id?? tem alguma coisa no JComboBox q relaciona o ID? pois não achei nada parecido na net!!

Obrigado

9 Respostas

leonardoMachado

como vc esta alimentando seu JComboBox?
vc esta usando alguma coisa do tipo List?

P

O legal é você trabalhar com objetos dentro do DataModel, de forma que o seu objeto contenha o id, nome e qualquer outra informação que você precise. Por padrão o DefaultCellRenderer imprime o toString do objetos, mas você pode implementar o seu custom CellRenderer, e alterar a forma de exibição no componente. Entendeu?

ericmaicon

cb_cliente.removeAllItems(); ResultSet rs_cl = MySQL.ConsultaSQL("SELECT cl_id, cl_nome " + "FROM rh_clientes " + "ORDER BY cl_id DESC"); while(rs_cl.next()) { cb_cliente.addItem(rs_cl.getString(2)); }

eu alimento assim!!

onde o MySQl. ConsultaSQL eh uma classe minha de conexão

leonardoMachado

A forma com que trabalho com JComboBox, JTable, para vincular elementos é a partir de um List.
Onde o elemento que esta selecionado corresponde ao indice da lista.
Mas deve ter outras formas de se fazer, como uso o Hibernate fica um pouco mais facil de fazer.
Abraços

M

Você pode usar um HashMap, que é uma espécie de lista ordenada com índice: cada elemento da esquerda tem um correspondente na direita. Dê uma olhada num possível trecho:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.util.HashMap;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Mapa extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private HashMap<String, Integer> mapa = null;
	private JComboBox combo = null;
	private JLabel label = null;
	
	public Mapa() {
		super("Testando Mapa");
		mapa = new HashMap<String, Integer>();
		combo.removeAllItems();  
		ResultSet rs_cl = MySQL.ConsultaSQL("SELECT cl_id, cl_nome " +  
		                                                        "FROM rh_clientes " +  
		                                                        "ORDER BY cl_id DESC");  
		while(rs_cl.next()) {  
			mapa.put(rs_cl.getString(2), rs_cl.getInt(1));
		}
		Object[] aux = mapa.keySet().toArray();
		combo = new JComboBox(aux);
		combo.addActionListener(this);
		label = new JLabel("");
		getContentPane().setLayout(new FlowLayout());
		getContentPane().add(combo);
		getContentPane().add(label);
		setBounds(20, 20, 200, 200);
		setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == combo) {
			label.setText("ID = " + mapa.get(combo.getSelectedItem()));
		}
	}	
}

Se quiser mesmo usar essa solução, aí precisa entender um pouco melhor essa técnica. Tem que olhar a documentação da API e se precisar, chama a gente aqui no fórum.

M

Rode o programa acima e veja se é esse o resultado esperado.

fabiozoroastro

Bom dia ericmaicon.
Eu utilizo uma classe auxiliar para popular os meus combos. Desta forma eu tenho chave e valor para o meu JComboBox.

Veja a implementação da classe:

package meupacote;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.MissingResourceException;

import org.apache.commons.beanutils.BeanUtils;

import br.com.cit.caf.exception.SystemException;

import com.vale.mi.planejamento.aps.framework.commons.bundle.APSInter;
import com.vale.mi.planejamento.aps.framework.commons.util.ReflectUtil;

/**
 * Classe que representa um item de um ComboBox.<br> Foi criada para
 * agrupar um objeto como valor, e uma string como descrição.
 * 
 * 
 * @param <T>
 */
public class ComboBoxItem<T> implements Comparable<ComboBoxItem>{
	private T value;

	private String text;

	/**
         * ESTE É APENAS UM MÉTODO AUXILIAR
	 * Retorna uma lista de ComboBox a partir da lista informada com valores do Bundle.
	 * 
	 * @param list
	 * @param fieldKey
	 *            field que será a have do combo
	 * @param fieldValue
	 *            field que será o valor do combo
	 * @param blankFirst
	 *            informe true se desejar o primeiro item em branco.
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static List<ComboBoxItem> getListComboBoxItemBundle( List<?> list, final boolean blankFirst,
			final String... fields ) {

		List<ComboBoxItem> result = new ArrayList<ComboBoxItem>();

		if ( list != null && !list.isEmpty() ) {

			if ( blankFirst ) {
				result.add( new ComboBoxItem( null, "" ) );
			}
			// Percorre todos os registros e monta o comboBoxItem.
			for ( Object o : list ) {
				try {
					StringBuffer text = new StringBuffer();
					if ( fields != null && fields.length > 0 ) {

						for ( int i = 0; i < fields.length; i++ ) {

							text.append( APSInter.getInstance().getBundle().getString( BeanUtils.getProperty( o, fields[i] ) ) );
							// Adiciona um traço se houver mais fields
							if ( ( i + 1 ) < fields.length ) {
								text.append( " - " );
							}
						}

						result.add( new ComboBoxItem( o, text.toString() ) );
					}
				} catch ( Exception e ) {
					throw new SystemException( e );
				}
			}
		}

		//Collections.sort( result );
		
		return result;
	}
	
	/**
         * ESTE É APENAS UM MÉTODO AUXILIAR
	 * Retorna uma lista de ComboBox a partir da lista informada.
	 * 
	 * @param list
	 * @param fieldKey
	 *            field que será a have do combo
	 * @param fieldValue
	 *            field que será o valor do combo
	 * @param blankFirst
	 *            informe true se desejar o primeiro item em branco.
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static List<ComboBoxItem> getListComboBoxItem( List<?> list, final boolean blankFirst,
			final String... fields ) {

		List<ComboBoxItem> result = new ArrayList<ComboBoxItem>();

		if ( list != null && !list.isEmpty() ) {

			if ( blankFirst ) {
				result.add( new ComboBoxItem( null, "" ) );
			}
			// Percorre todos os registros e monta o comboBoxItem.
			for ( Object o : list ) {
				try {
					StringBuffer text = new StringBuffer();
					if ( fields != null && fields.length > 0 ) {

						for ( int i = 0; i < fields.length; i++ ) {

							text.append( BeanUtils.getProperty( o, fields[i] ) );
							// Adiciona um traço se houver mais fields
							if ( ( i + 1 ) < fields.length ) {
								text.append( " - " );
							}
						}

						result.add( new ComboBoxItem( o, text.toString() ) );
					}
				} catch ( Exception e ) {
					throw new SystemException( e );
				}
			}
		}

		return result;
	}	

	/**
         * ESTE É APENAS UM MÉTODO AUXILIAR
	 * Retorna uma lista de ComboBox a partir do enum informada.
	 * @param enumType
	 * @param blankFirst
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static List<ComboBoxItem> getListComboBoxItem( Class<? extends Enum> enumType, final boolean blankFirst ) {
		List<ComboBoxItem> result = new ArrayList<ComboBoxItem>();

		if ( blankFirst ) {
			result.add( new ComboBoxItem( null, "" ) );
		}

		for (Object item : enumType.getEnumConstants()) {
			String labelKey = ReflectUtil.getInstance().getFieldValue(item, "label");
			String label = null;
			try {
				label = APSInter.getInstance().getBundle().getString(labelKey);
			} catch(MissingResourceException e){
				label = labelKey;
			}
			result.add( new ComboBoxItem( item, label ) );
		}

		return result;
	}

	public ComboBoxItem(T value, String text) {
		this.value = value;
		this.text = text;
	}

	public ComboBoxItem(T value) {
		super();
		this.value = value;
	}

	public T getValue() {
		return value;
	}

	public void setValue( T value ) {
		this.value = value;
	}

	public String getText() {
		return text;
	}

	public void setText( String text ) {
		this.text = text;
	}

	@Override
	public String toString() {
		if ( text != null )
			return text;
		else if( value != null ) 
			return value.toString();
		else 
			return null;
	}

	@Override
	public boolean equals( Object obj ) {
		boolean result = false;
		if ( text != null && obj != null && obj.toString() != null  ) {
			result = this.text.trim().equals( obj.toString().trim() );
		}
		return result;
	}

	public int compareTo( ComboBoxItem o ) {
		return toString().compareTo( o.toString() );
	}

}

E para setar a lista de ComboBoxItem no combo:

meuCombo.setModel( new javax.swing.DefaultComboBoxModel( listaComboBoxItemCriada.toArray() ) );

Espero ter ajudado.
Abraço.

ericmaicon

opa opa…pera aí!! hehehe!! eu até assustei aqui…muitas respostas…muuuito obrigado, fazia tempo q não via uma comunidade assim!!

vou estudar primeiro sobre o QUE é hash map, hehehe, depois vou estudar as outras classes para ver se consigo implementar aqui…ai se eu tiver dúvida volto aqui!

realmente muito obrigado e Parabéns!!

tiaguinhooo

cria um modelo pro seu combo q nem jtable

tenta assim

/**
 *
 * @author Tiago
 */
public  class cCliente {
    private String value;
    private int key;
    public cCliente(int key, String value) {
        this.key=key;
        this.value=value;
    }



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

     public int getKey() {
         return key;
     }

 }
//CLASSE DO COMBO VEJA NELE EM O ID E O NOME DO FULANOJESEBELTO !=)
//vetor pra por os dados
 Vector vCliente = new Vector();

        
//for 2.alguma coisa ou for do seu rs e tal
        for(Cliente c: ClienteList) {

//objeto da sua classe acima dentro vc poe o id e o nome 
            cCliente cmb = new cCliente(c.getId(),c.getRazaoCli() );
            vCliente.add(cmb);
//aki vc add o cmb (objeto) dentro do vetor ! XD umdentro do outro usuaushuh ! brincadera

        }

// esse e o seu modelo de combo la em cima da sua classe declara isso aki veja ---&gt;private ComboBoxModel modelocCliente ;
        modelocCliente = new DefaultComboBoxModel(vCliente);
//AKi esse nome sem norma aki e o nome do combo "comboaltcli" se seta o modelo dele
        comboaltcli.setModel(modelocCliente);

ai agora vc pega as info veja desse jeito

// aki ele ia pega o nome vc disse q tras o nome e qr o id 
Object obj3 = comboaltcli.getSelectedItem();

        int valor =0;
//passa pra int pega o valor da um cast pra classe cCliente pega a key
        valor = Integer.parseInt(String.valueOf(((cCliente) obj3).getKey())) ;
out.print valor ... bla bla

acho q isso ajuda
peguei o mesmo exemplo no forum so q eu nao coloquei o link akipq eu nao achei

blz te mais

Criado 23 de dezembro de 2008
Ultima resposta 23 de dez. de 2008
Respostas 9
Participantes 6