Essa classe é uma contribuição de Felipe Priuli para o projeto Towel, e também foi ele que escreveu este artigo de como utiliza-lo.

Esta classe implementa com.towel.bean.Formatter e foi criado, primeiramente, para ser utilizado no ObjectComboBoxModel, permitindo criar um Formatter dinamicamente para
as classes que serão utilizada como model de um ComboBox. Em outras palavras, ao invés de criar um Formatter para cada classe é possível utilizar este Formatter
para representar as classes de maneira genérica.

Ele funciona permitindo adicionar FieldResolvers a uma lista que será utilizada para obter os valores dos objetos do modelo, para ver uma explicação detalhada de como o FieldResolver funciona, veja no artigo sobre ObjectTableModel.

Vamos para o exemplo:

Primeiro! Vamos criar a classe Person:

public class Person {
        private String name;
        private int age;
        public Person(String str, double d) {
                this.name = str;
                this.age = (int) d;
        }
        public String toString() {
                return "Name: " + name + " age: " + age;
        }
}

Nós queremos mostrar informações sobre a pessoa em cada iten do JComboBox, mas ao inves de criar um Formatter para a classe Pessoa, vamos utilizar o DynamicFormatter.

Abaixo um exemplo de como criar um JComboBox de ‘Person’ utilizando o model ObjectComboBoxModel com o DynamicFormatter:

import javax.swing.*;

import com.towel.awt.ann.*r;
import com.towel.bean.DynamicFormatter;
import com.towel.combo.swing.ObjectComboBoxModel;
import com.towel.el.FieldResolver;

public class ComboBoxDynamicFormatterTest extends JFrame {
	private ObjectComboBoxModel model;
	@Action(method = "showPerson")
	private JButton button;

	public ComboBoxDynamicFormatterTest() {
		super("ComboBoxModel");
		model = new ObjectComboBoxModel();

		DynamicFormatter formatter = new DynamicFormatter(
				Person.class, " - ");
		formatter.addField(new FieldResolver(Person.class, "name"));
		formatter.addField(new FieldResolver(Person.class, "age"));

		model.setFormatter(formatter);
		// Adicionado as classes Person no model
		model.add(new Person("A", 10.0));
		model.add(new Person("B", 20.0));
		model.add(new Person("C", 30.0));
		model.add(new Person("D", 40.0));
		model.add(new Person("E", 50.0));

		JComboBox combo = new JComboBox(model);
		JPanel cont = new JPanel();
		cont.add(combo);
		cont.add(button = new JButton("Show"));
		setContentPane(cont);
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);

		new ActionManager(this);// Necessary to map @Action to the method
	}

	private void showPerson() {
		Person p = model.getSelectedObject();
		System.out.println(p.toString());
	}

	public static void main(String[] args) {
		new ComboBoxDynamicFormatterTest();
	}
}

Ele ainda tem a vantagem que se for necessario exibir um campo que seja GregorianCalendar, é possivel adicionar o Formatter ao FieldResolver desse atributo para exibir um valor mais amigavel do que o valor padrão do toString.

Os métodos utilizados para criar os itens em um ComboBox de maneira generica, pela classe DynamicFormatter são:

  • addField(FieldResolver) : Ele permite adicionar um resolver a lista que será utilizada para montar a String que representa o objeto.
  • format(Object) : O método ‘format’ faz a conversão do objeto para texto. O texto é aquele que será mostrado no item do ComboBox.
  • setSeparator(String) : Este método permite que você indique o texto que irá separar o texto dos itens e é usado quando existir mais de um campo que irá aparecer no item de JComboBox
  • getFieldList() : Este método retorna uma lista de FieldResolver. O FieldResolver é responsável por obter os valores dos atributos (Fields) dos objetos, estes valores são então mostrados nos itens combobox.