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";
}
}
}
[...] No exemplo também está com a anotação @Action, também do projeto, para entende-la ver este artigo. [...]
[...] Acesse com este novo link. [...]