Para usar as classes do projeto acesse a pagina Towel Project desse blog para baixar o projeto.

Bem.. essa idéia surgiu em uma conversa com o Felix (Felagund do GUJ) que também aderiu ao projeto.

Como adoro annotations, criei mais uma para isso, a annotation Action que tem dois atributos.

String method() default “” – Caso queira mapear um botão para simplesmente invocar um método quando pressionada só é necessario passar o nome dele nesse atributo

Class<? extends ActionListener> listener() default ActionListener.class – Caso voce queira que um ActionListener seja chamado voce precisa passar o .class da classe que implementa ele para esse atributo.

Aproveitei o código do artigo que fiz para o binder apenas modificando o modo que crio as ações para os botões.


import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import com.towel.awt.ann.Action;
import com.towel.awt.ann.ActionManager;
import com.towel.bind.Binder;
import com.towel.bind.annotation.AnnotaddedBinder;
import com.towel.bind.annotation.Bindable;
import com.towel.bind.annotation.Form;
@Form(Pessoa.class)
public class PessoaForm extends JFrame {
 @Bindable(field = "nome")
 private JTextField nome;
 @Bindable(field = "idade", formatter = IntFormatter.class)
 private JTextField idade;
 @Bindable(field = "vivo")
 private JCheckBox vivo;
 private Binder binder;
 @Action(method = "add")//Mapeando a ação para o método add
 private JButton add;
 @Action(listener = Listener.class)//Mapeando a ação para o listener
 private JButton load;
 public PessoaForm() {
  super("PessoaForm");
  nome = new JTextField(20);
  idade = new JTextField(20);
  vivo = new JCheckBox("Vivo?");
  add = new JButton("Add");
  load = new JButton("Load");
  setLayout(new GridLayout(5, 2));
  add(new JLabel("Nome:"));
  add(nome);
  add(new JLabel("Idade:"));
  add(idade);
  add(new JLabel());// Por causa do GridLayout
  add(vivo);
  add(add);
  add(load);
  pack();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setLocationRelativeTo(null);
  binder = new AnnotaddedBinder(this);
  new ActionManager(this);// Mapeia as @Action para os JButtons.
 }
 public static void main(String[] args) {
  new PessoaForm().setVisible(true);
 }
 // Listener mapeado para o botão "load"
 private class Listener implements ActionListener {
  @Override
  public void actionPerformed(ActionEvent e) {
   Pessoa pessoa = new Pessoa();
   pessoa.setNome("Marky");
   pessoa.setIdade(18);
   pessoa.setVivo(true);// Claro
   binder.updateView(pessoa);
  }
 }
 // Metodo mapeado para o botão "add"
 private void add() {
  Pessoa pessoa = new Pessoa();
  binder.updateModel(pessoa);
  pessoa.printAttrs();
 }
 // IntFormatter sera usado para transformar a String em numero.
 public static class IntFormatter implements mark.utils.bean.Formatter {
  public Object format(Object obj) {
   Integer d = (Integer) obj;
   return d.toString();
  }
  public Object parse(Object obj) {
   return Integer.valueOf(Integer.parseInt((String) obj));
  }
  public String getName() {
   return "int";
  }
 }
}