Dúvida com ObjectComboBoxModel

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.

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.

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?

Tem esse que postei em portugues com um exemplo melhor.

Prezado Marky.Vasconcelos,

É o mesmo exemplo do seu Wiki.

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.

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

Algo como uma lista de LabelValueBean do Struts.

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.

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?

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

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?

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/