Trabalhando com JCOMBOBOX

Boa tarde pessoal. Resolvi postar aqui como consegui trabalhar com JComboBox. Então, vamos la …

1º) Primeiramente eu criei um método para construir meus JComboBox, faço isso tambem pra jLabel, jButtons, Jtext e o que mais me der na telha. Segue código.

package gerador;
public class GeraCboBox extends javax.swing.JComboBox {    
    public GeraCboBox(int x, int y, int w, int h, Object [] obj, String dica){
        this.removeAllItems();
        for(int i=0;i<obj.length;i++){
            this.addItem(obj[i]);
        }        
        this.setSelectedIndex(-1);
        this.setBounds(x,y,w,h);
        this.setToolTipText(dica);        
    }
    public GeraCboBox(int x,int y, int w, int h, Object [] obj){
        this(x,y,w,h,obj,null);
    }
}

Com esse método, que fica em uma Biblioteca, eu crio o meu jComboBox posicionando ele onde quero. Tbem determino sua altura e largura. Reparem que passo um “objeto” pra ele. Geralmente vejo o pessoal usando o jComboBox apenas com String … mas eu nem consigo imaginar como isso funciona, porque ao meu entender tem que ter no mínimo “código e Descrição”.

2º) Criei outra classe para o meu “Objeto” da classe GeraCboBox. É essa classe que passo como parâmetro ao chamar a GeraCboBox. Segue código:

package modao;

import java.util.List;
import javax.swing.JComboBox;
/**
 * Instancia combobox
 * @author vonquelbe.caldeira
 * @param codigo Código do combo
 * @param descr Descrição do combo que será exibida pelo "toString"
 * @param ind Indice do código
 */
public class ComboItem {
    private String codigo;
    private String descr;
    private int    ind;

    public ComboItem() {/*Construtor padrão*/}
    public ComboItem(String codigo, String descr, int ind) {
        this.codigo = codigo;
        this.descr  = descr;
        this.ind    = ind;
    }
    @Override
    public String toString () { return descr; }
    public String getDescr () { return descr; }
    public String getCodigo() { return codigo;}
    public int    getInd   () { return ind;}
/**
 * Lista os itens do Combo
 * @param lista
 * @return 
 */ public static ComboItem [] ComboList (List <?> lista) {
        ComboItem [] obj = new ComboItem [lista.size()];
        for(Object o: lista){
            String [] array = lista.get(lista.indexOf(o)).toString().split(";");
            obj [lista.indexOf(o)] = new ComboItem(array[0], array[1], lista.indexOf(o));
        }
        return obj;
    }    
/**
 * Retorna o indice do jComboBox
 * @param codigo
 * @param combo
 * @return 
 */ public static int ComboGetInd (String codigo, JComboBox combo) {
        for (int i=0;i<combo.getItemCount();i++){
            ComboItem item = (ComboItem) combo.getItemAt(i);
            if (item.getCodigo().equals(codigo)){
                return item.getInd();
            }
        }
        return -1;
    }
/**
 * Retorna o código do jComboBox
 * @param item
 * @return 
 */ public static String ComboGetCod (Object obj) {
        if (obj instanceof ComboItem){
            ComboItem item = (ComboItem) obj;
            return item.getCodigo();
        }
        return "";
    }
}

Resumidamente … todo jComboBox que fizer terá Código, Descrição (Que é o que aparece para o usuário) e indice. A Descrição é exibida porque reescrevi o método “ToString”.
Aproveitei esta mesma classe e criei 3 métodos que são:

  1. ComboList - Este método recebe um Array List dinâmico e me retorna a lista do meu jCombobox.
  2. ComboGetInd - Recebe uma String (Código) e a lista do Combobox e me retorna um “INT” que é o indice, caso ele encontre o código na lista do Combobox.
  3. ComboGetCod - Recebe um objeto, verifica se este objeto é do tipo ComboItem e retorna uma String (Código).

Ufa … muita coisa não ??? … Repasse tudo caso tenha ficado alguma dúvida …

Bom … agora é só usar:

GeraCboBox continentes = new GeraCboBox(100, 88,160,20, ComboItem.ComboList(ContDao.listaDados()));

ContDao.listaDados() é um método que listo de uma tabela todos os continentes … ele me retorna um array list com estes dados e são esses dados que passo como parâmetro para o método “ComboItem.ComboList”.

Segue método:

public static List <ContMod> listaDados (String codigo) {
        List <ContMod> lista = new ArrayList();
        ContMod obj;
        if (codigo.isEmpty()){
            SQL = new StringBuilder("select * from aux_continente order by descr");
        } else {
            SQL = new StringBuilder("select * from aux_continente where codcont = '"+codigo+"'");
        }            
        try {
            conn = Conn.getConnection();
            ps = conn.prepareStatement(SQL.toString());
            //ps.setString (1, codigo);
            rs = ps.executeQuery();
            while(rs.next()){
                obj = new ContMod(rs.getString("codcont"),rs.getString("descr"),"");
                lista.add(obj);
            }
        } catch (Exception e) {
            Util.mensagem("Error (Lista): "+e.getMessage());
        } finally {
            Conn.closeConnection(conn, ps, rs);
        }        
        return lista;
    } public static List <ContMod> listaDados () {
        return ContDao.listaDados("");
    }

PS.: Esse método é de cada um … vc deve fazer o seu mas um detalhe que tenho que compartilhar é:
Esse é o modelo da minha tabela Continente:

public class ContMod {

    public ContMod() {
    }
    public ContMod(String codigo) {
        this.codigo = codigo;
    }    
    public ContMod(String codigo, String descr) {
        this(codigo);
        this.descr = descr;
    }    
    public ContMod(String codigo, String descr, String acao) {
        this(codigo, descr);
        this.acao = acao;
    }

    private String  codigo;
    private String  descr;
    private String acao;

    public String getCodigo () {return codigo;}
    public String getDescr () {return descr;}
    public String getAcao () { return acao;}

    public void setCodcont(String codigo) {this.codigo = codigo;}
    public void setDescr (String descr) {this.descr = descr;}        
    public void setAcao (String acao) {this.acao = acao; }
    
    @Override
    public String toString () {return codigo+";"+descr;}
}

Repare que eu reescrevi o método “ToString” concatenando o código e a Descrição. Desculpe … não achei outra forma de fazer funcionar.
Volte na classe “ComboItem”, no método “ComboList” e repare que ele faz um “Split” do método “lista.get” … então, apesar de passarmos um Arraylits dinamicamente, eu tenho que usar o método “get” que traz na verdade o que esta no “ToString”, e como eu concatenei o código com a descrição preciso separa-los agora. Então todo método que for usado para criar a sua lista do jComboBox deve ter seu método “ToString” reescrito desta forma.

FINAL:

Por fim quando quero exibir determinado código no jComboBox eu faço assim:
continente.setSelectedIndex(ComboItem.ComboGetInd("BR", continente));
chamo o método ComboGetInd da minha classe ComboItem passando o código e o jCombobox como parâmetro

"BR" foi forçar a barra, na verdade o “código” esta oculto no meu Grid. O correto é fazer assim …
continente.setSelectedIndex(ComboItem.ComboGetInd ( (String) jTableAplic.getModel().getValueAt(linha, 2), continente));

Ja ia esquecendo:

ContMod cont = new ContMod(ComboItem.ComboGetCod(continente.getSelectedItem()))

pego o item selecionado no ComboBox … uso esse métodoa para Inserir e atualizar os dados da tabela:

Segue tela do projeto:

Só pra vcs terem uma idéia. “Dados Gerais” vai sendo atualizado enquanto percorro o “Grid”
Fiquem a vontade para opinar …

Me parece bem mais simples implementar um ComboBoxModel para renderizar uma lista de objetos quaisquer.

Acho que agora ta legal. Consegui colocar em uma única classe usando Model e Renderizando. Na Renderização eu apenas pego o código e descrição pra poder recuperar com os métodos “GET”.

1. package gerador;

2. import java.awt.Component;
3. import javax.swing.DefaultComboBoxModel;
4. import javax.swing.DefaultListCellRenderer;
5. import javax.swing.JComboBox;
6. import javax.swing.JLabel;
7. import javax.swing.JList;
8. import javax.swing.ListCellRenderer;

9. public class GeraCboBox extends JComboBox {
10.     
11.     private String codigo;
12.     private String descr;
13.     private Object [] lista;
14.  // Get
15.     @Override
16.     public String toString () {return descr;}
17.     public String getDescr () {return descr;}
18.     public String getCodigo() {return codigo;}
19.     public int getIndex(String codigo) {
20.         for(int i=0;i<lista.length;i++){
21.             if (lista[i] instanceof GeraCboBox){
22.                 GeraCboBox item = (GeraCboBox) lista[i];
23.                 if (item.getCodigo().equals(codigo)){
24.                     return i;
25.                 }
26.             }
27.         }        
28.         return -1;
29.     }
30. /**
31.  * Construtor de ComboBox com Código e Descrição
32.  * @param codigo
33.  * @param descr 
34.  */ public GeraCboBox(String codigo, String descr) {
35.         this.codigo = codigo;
36.         this.descr  = descr;
37.     }
38. /**
39.  * Construtor dinâmico de JComboBox
40.  * @param x Posição do combo (coluna)
41.  * @param y Largura do combo (linha)
42.  * @param w Largura do Combo 
43.  * @param h Altura do Combo 
44.  * @param lista Lista do ComboBox
45.  * @param dica 
46.  */ public GeraCboBox(int x, int y, int w, int h, Object [] lista, String dica) {
47.         this.lista = lista;
48.         this.removeAllItems();
49.         this.setModel(new DefaultComboBoxModel(){
50.             @Override
51.             public int getSize() {return lista.length;}
52.             @Override
53.             public Object getElementAt(int index) {return lista[index];}
54.         });
55.         this.setSelectedIndex(-1);
56.         this.setBounds(x,y,w,h);
57.         this.setToolTipText(dica);
58.         this.setRenderer(new MeuCellRenderer());
59.       //Recupera Métodos: ((Listagem)box.getSelectedItem()).getCodigo()
60.     }
61. /**
62.  * Construtor dinâmico de JComboBox
63.  * @param x Posição do combo (coluna)
64.  * @param y Largura do combo (linha)
65.  * @param w Largura do Combo 
66.  * @param h Altura do Combo 
67.  * @param lista Lista do ComboBox
68.  */ public GeraCboBox(int x, int y, int w, int h, Object [] lista) {this(x,y,w,h,lista,null);}
69.     
70.  // Renderizador
71.     public class MeuCellRenderer implements ListCellRenderer {
72.         protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
73.         @Override
74.         public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
75.             JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index,isSelected, cellHasFocus);
76.             if (value != null) {
77.                 if (value instanceof GeraCboBox){
78.                     codigo = ((GeraCboBox)value).getCodigo();
79.                     descr  = ((GeraCboBox)value).getDescr();
80.                 } else {
81.                     codigo = String.valueOf(value);
82.                 }
83.             }
84.             return renderer;
85.         }
86.     }
87. }

Se quiserem testar ou ver como passo a declarar as JCOMBOBOX e como recupero qualquer atributo da combo selecionada, ou como posiciono a combo a partir de um código.

1. package acao;

2. import gerador.GeraCboBox;
3. import java.awt.Container;
4. import java.awt.event.ActionEvent;
5. import java.awt.event.ActionListener;
6. import javax.swing.JButton;
7. import javax.swing.JFrame;
8. import javax.swing.JOptionPane;
9. import javax.swing.JTextField;

10. public class Inicio {

11.     private static Container container;
12.     private static JFrame tela;
13.     
14.     public static void main(String[] args) {
15.         
16.         tela = new javax.swing.JFrame();
17.      // Tamanho da tela e container
18.         tela.setSize(300,150);
19.         tela.setTitle("Criando JComboBox - Método dinâmico");
20.         tela.setResizable(false);
21.         tela.setLocationRelativeTo(null);
22.         tela.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
23.      // Container da tela
24.         container = tela.getContentPane();
25.         container.setLayout(null);       
26.      // Campo Texto
27.         JTextField texto = new JTextField("RJ");
28.         texto.setBounds(10,10,150,23);
29.         texto.setToolTipText("Informe código para busca");
30.      // ComboBox
31.         GeraCboBox combo[] = {new GeraCboBox("RJ", "Rio de Janeiro")
32.                              ,new GeraCboBox("SP", "São Paulo")
33.                              ,new GeraCboBox("MG", "Minais Gerais")
34.                              };
35.         GeraCboBox box = new GeraCboBox(10,70,150,20, combo, null);
36.      // Botão
37.         JButton busca = new JButton("Busca");
38.         busca.setBounds(165,10,70,22);
39.         busca.setToolTipText("Efetua a busca pelo código");
40.         busca.addActionListener(new ActionListener() {

41.             @Override
42.             public void actionPerformed(ActionEvent e) {
43.                 JOptionPane.showMessageDialog(null, "Antes: "+box.getCodigo()+" => "+
44.                                                     box.getDescr()+" ("+
45.                                                     box.getSelectedIndex()+"). \n"+
46.                                                     "Busca: "+texto.getText());
47.                 box.setSelectedIndex(box.getIndex(texto.getText()));
48.             }
49.         });
50.      // Adiciona 
51.         container.add(texto);
52.         container.add(box);
53.         container.add(busca);
54.      // Abre tela
55.         tela.setVisible(true);
56.     }
57. }