Dúvida com ObjectComboBoxModel

11 respostas
pgioseffi

Prezados,

O ComboBox do HTML permite que nós mostremos ao usuário um texto, mas por trás guardemos um outro valor, por exemplo, inteiro.

Gostaria de saber se o ObjectComboBoxModel faz o mesmo.

11 Respostas

Marky.Vasconcelos

Se você está usando o ObjectComboBoxModel do Towel, sim.

Ele exibe de acordo com o Formatter, mas guarda uma List dos seus objetos por dentro.

Quando algo for selecionado, basta recuperar o item que voce já tems eu objeto com todos os atributos.

pgioseffi

Você tem exemplos de uso além daqueles no Github?

No seu Wiki, você diz que para usarmos o ObjectComboBoxModel teríamos que criar uma classe e seu formatador.

No meu caso, eu não acredito necessitar de um formatador nem de uma classe. Minha query já retorna uma String com o nome e um int com o valor desse nome, bem como funciona o combo do HTML mesmo.

Vc tem algum exemplo de como funcionaria sua implementação?

Marky.Vasconcelos

Tem esse que postei em portugues com um exemplo melhor.

pgioseffi

Prezado Marky.Vasconcelos,

É o mesmo exemplo do seu Wiki.

Marky.Vasconcelos

Nossa, jurava que estava diferente.

Mas qual é a sua duvida?

Voce tem que retornar uma lista de objetos para o model e não uma lista de Strings.

pgioseffi

Eu queria algo simples, como o combo do HTML mesmo.

Algo como uma lista de LabelValueBean do Struts.

Marky.Vasconcelos

Mas voce tem algo parecido, o que voce retorna do seu banco? Uma List de Strings? Não deveria. Voce precisa retornar uma lista de objetos, se quiser crie um LabelValueBean com os atributos que voce quer, preenchaos no seu DAO e crie um Formatter para exibir apenas os atributos que voce quer.

pgioseffi

Marky.Vasconcelos,

O que vem do meu banco é um ResultSet com a primeira coluna com uma String e a segunda com um int. Eu pego esse ResultSet e itero ele adicionando à um List. Aí é que entra o problema.

Se fosse um projeto web com struts, eu popularia o List seria um List<LabelValueBean> e aí no JSP, eu faria um forEach sob esse List adicionado o label à descrição da combo e o value ao valor da combo.

Porém, aqui estou com um projeto Swing e o JComboBox não me dá essa abstração de descrição e valor na combo. Então eu teria que criar uma classe e extender o JComboBox.

Como venho estudando seu projeto Towel, eu lembrei do seu ObjectComboBoxModel que atuaria no Model do JComboBox já hj existente.

Eu já tenho meu retorno como te disse de String e int e gostaria de usar seu projeto para colocar ambos os valores no meu JComboBox. O usuário vê um texto, mas internamente, meu sistema trabalharia com o id daquele texto e facilitaria minhas instruções SQL.

Enfim, não existe como eu fazer isso no seu projeto sem criar uma classe q guarde o String e o Int e o formatador desta classe?

Marky.Vasconcelos

Ta bom então, vou explicar melhor o que eu quiz dizer:

Um Bean que voce mesmo criou:

public class ValueBean{
private int id;
private String value;
//Construtor + getters & setters
}

Seu metodo que recupera os dados

public List<ValueBean> getDados(){
List<ValueBean> result = new ArrayList<ValueBean>();
ResultSet rs = realizaConsulta();
while(rs.next())
result.add(new ValueBean(rs.getInt("id"), rs.getString("valor")));

//fecha tudo

return result;
}

Agora na sua tela, voce usa essa List de ValueBeans para popular seu ComboBox.

ObjectComboBoxModel<ValueBean> model = new ObjectComboBoxModel<ValueBean>();
//Declara o Formatter
DynamicFormatter formatter = new DynamicFormatter(
				ValueBean.class, "");
//Adiciona o atributo "value" para ser exibido
formatter.addField(new FieldResolver(ValueBean.class, "value"));
model.setFormatter(formatter);
model.setData(listaQueVemDoSeuDAO);

Dai é só voce popular seu JComboBox com esse model, internamente ele vai ter o id, mas o usuario vai ver apenas o value.

PS: Em alguma ação voce pode fazer o seguinte para pegar o objeto que ele selecionou

ValueBean p = model.getSelectedObject();
//p vai ter o id e o value
pgioseffi

Prezado Marky.Vasconcelos,

Foi exatamente o que eu entendi então. Não tem como fugir de criar uma classe nova. Mas não tem que criar o Formatter.

Caso você criasse o Formatter. Qual seria sua sugestão?

Marky.Vasconcelos

Se voce já estiver retornando objetos no seu DAO voce só precisa criar o Formatter, e para um caso simples, voce pode usar o DynamicFormatter que já faz parte do Towel.

Voce pode ver mais sobre o DynamicFormatter em: http://markytechs.wordpress.com/2011/02/12/dynamicformatter/

Criado 17 de maio de 2011
Ultima resposta 18 de mai. de 2011
Respostas 11
Participantes 2