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:
- ComboList - Este método recebe um Array List dinâmico e me retorna a lista do meu jCombobox.
- 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.
- 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 …