Boa tarde amigos!
Tenho um ComboBox na aplicação e uma tabela X no banco de dados, vamos supor que esta tabela tenha apenas duas colunas [“codigo”, “descricao”].
Do um loop com while do resultset e vou criando objetos dentro do combobox.
Segue o código da classe para o combobox:
public class comboMultidata {
private String valor;
private String texto;
public comboMultidata(String id, String label) {
this.valor = id;
this.texto = label;
}
public String getValor() {
return valor;
}
@Override
public String toString() {
return texto;
}
}
a parte do código que cria os objetos dentro do combobox:
db.consultar("SELECT codigo, descricao FROM tabela");
while(db.rst.next())
{
codigo = db.rst.getString("codigo");
descricao = db.rst.getString("descricao");
combobox_teste.addItem(new comboMultidata(codigo, descricao));
}
O código para recuperar o id, já que o que aparece no combobox é a descricao:
String combo = ((comboMultidata)combobox_teste.getSelectedItem()).getValor();
JOptionPane.showMessageDialog(null, combo);
OK, OK… agora entra a minha dúvida que estou lutando para encontrar a resposta.
Como eu faço para executar com sucesso o seguinte:
combobox_teste.setSelectedItem("descricaoD"); // descricaoD é o quarto item do combo e no momento, descricaoA está selecionado.
Ou seja, como faço para dar um setSelectedItem? Já que dentro dos parenteses eu colocaria o item, porém como são objetos e não strings, não é da mesma forma.
No aguardo
Uma forma é você recuperar o Model do seu ComboBox e localizar o objeto desejado dentro desse Model.
DefaultComboBoxModel model = (DefaultComboBoxModel) jComboBox.getModel();
for (int i = 0; i < model.getSize(); ++i) {
ComboMultidata cmd = (ComboMultidata) model.getElementAt (i);
if (cmd.getTexto().equalsIgnoreCase(....))
// achou o objeto desejado
}
Outra é você criar um ComboBoxModel onde seja fácil de achar o elemento desejado. Procure por GlazedLists na Internet e veja como resolver esse problema de uma vez por todas.
Esta é simples:
No caso acima vc transforma o ítem selecionado, no ítem que vc quiser, passando no método getItemAt o índice do ítem que vc quiser.
Obrigado amigos! Estava estudando sobre o que me explicaram, por isso a demora.
Para a comunidade, o código então ficaria o seguinte:
OBS.: Supondo que a variável "codigo" é código que desejo encontar no combobox.
DefaultComboBoxModel model = (DefaultComboBoxModel) combobox_teste.getModel();
String valor;
for (int i = 0; i < model.getSize(); ++i)
{
comboMultidata cmd = (comboMultidata) model.getElementAt (i);
valor = cmd.getValor();
if(valor.equals(codigo))
{
combobox_teste.setSelectedItem(combobox_teste.getItemAt(i));
}
}
Então, voltando ao comentário sobre o GlazedLists, dei uma lida sobre o assunto, mas dentro do JComboBox eu não entendi como poderia fazer esse mesmo processo.
Alguém poderia me explicar?
OBS.: Esta forma descrita a cima, com o ComboBoxModel não está sensivelmente grande para este tipo de ação? Não existe alguma outra forma para otimizar este trabalho?
Forte abraço e mais uma vez, Muito Obrigado pela ajuda que já me deram.
Sim, está bem chatinho.
No caso do GlazedLists, você pode criar um ComboBoxModel que é ordenado por alguma chave (usando um SortedList). A seguir, você pode usar o método sortedIndexOf (se não me engano) para poder, a partir de um elemento exemplo, pegar um objeto mais rapidamente que simplesmente ficar percorrendo (argh).
Olá thingol!
Obrigado pela explicação, porém me resta uma dúvida, se poderes me esclarecer.
Seguinte, é tipo um JQuery para Java? Você acha o item com muita facilidade, porém o método para utilização deste adicional seria mais ou menos o seguinte?
Grava dentro do combobox um vetor com índices e descrições, ou seja, o código e o nome. O nome é o que aparece no combobox, o código é o índice de pesquisa para o mesmo… então efetuando uma pesquisa no banco de dados e retornando o código necessário, buscaria pelo código dentro dos índices deste combobox e chamaria o setSelectedItem que retornaria por sua vez não o código e sim… o nome, a descrição propriamente dita.
Não sei se consegui ser claro sobre a minha dúvida. Caso tenha conseguido, seria isto?
abraço.