genesis 3.0-EA3: suporte Swing e Java 5

Finalmente, após oito meses de trabalho e contratempos, está disponível a versão 3.0-EA3 do genesis. Toda a documentação foi reformulada e há versões em inglês e português.

As novidades mais legais dessa versão são o binding Swing e o suporte a anotações do Java 5 (que também funcionam com Java 1.4 da mesma maneira). O conceito do binding no genesis é único porque você pode trabalhar com JavaBeans sem amarrar a lógica da sua aplicação a API gráfica (Swing e Thinlet, no momento). Por exemplo, pode-se codificar um form assim :


@Form
public class LoginForm {
   private String usuario;
   private String senha;

   public String getUsuario() {
      return usuario;
   }

   public void setUsuario(String usuario) {
      this.usuario = usuario;
   }

   public String getSenha() {
      return senha;
   }

   public void setSenha(String senha) {
      this.senha = senha;
   }

   @Action
   public void login() {
      System.out.println(usuario);
      System.out.println(senha);
   }

   @Action
   public void limpar() {
      setUsuario(null);
      setSenha(null);
   }
}

E ligá-lo a uma interface gráfica em Swing assim:


@ViewHandler
public class LoginSwingView extends JDialog {
   public LoginSwingView() {
      super(new JFrame(), "Login");
      initComponents();

      SwingBinder binder = new SwingBinder(this, new LoginForm());
      binder.bind();
   }

   private void initComponents() {
      getContentPane().setLayout(new GridLayout(2, 1));

      JPanel panelDados = new JPanel();
      panelDados.setLayout(new GridLayout(2, 2, 5, 5));

      JLabel labelUsuario = new JLabel();
      labelUsuario.setText("Usuário");
      panelDados.add(labelUsuario);

      JTextField usuario = new JTextField();
      usuario.setName("usuario");
      panelDados.add(usuario);

      JLabel labelSenha = new JLabel();
      labelSenha.setText("Senha");
      panelDados.add(labelSenha);

      JPasswordField senha = new JPasswordField();
      senha.setName("senha");
      panelDados.add(senha);

      getContentPane().add(panelDados);

      JPanel panelBotoes = new JPanel();

      JButton login = new JButton();
      login.setText("Login");
      login.setName("login");
      panelBotoes.add(login);

      JButton limpar = new JButton();
      limpar.setText("Limpar");
      limpar.setName("limpar");
      panelBotoes.add(limpar);

      getContentPane().add(panelBotoes);

      pack();

      setLocationRelativeTo(null);

      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            System.exit(0);
         }
      });
   }

   public static void main(String args[]) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            new LoginSwingView().setVisible(true);
         }
      });
   }
}

Ou seja, diferente de outros frameworks, o genesis não requer o uso de componentes proprietários e você pode usar tranquilamente o Matisse ou o VEP para desenhar suas telas, bastando setar o name dos componentes de acordo com o seu form. Mais detalhes sobre como o binding funciona podem ser encontrados na documentação.

4 Responses to “genesis 3.0-EA3: suporte Swing e Java 5”

  1. Ficou muito legal esse binding. Enquanto não sai um Web binding, poderia ter um empty-web-project super-simples que aproveitasse esses forms.

  2. Tetsuo disse:

    Há como fazer o binding com outras propriedades dos componentes, como ‘enabled’, ‘selected’? Por exemplo chamar ‘form.setNome_enabled(false)’ para desabilitar um textfield. Isto seria perfeito para fazer ‘subcutaneous testing’ da lógica das telas sem ter que instanciar componente visual algum, já que toda a lógica poderia ser feita diretamente no bean.

    Uma outra dúvida: quais as dependências mínimas para rodar a aplicação no cliente? Sem banco, sem thinlet, só swing+genesis. Tenho que embutir o runtime do werkz? jxpath? beanutils?

  3. [...] Começaram a aparecer dúvidas sobre o post que fiz a respeito do binding Swing suportado pelo genesis. Aproveito para responder aqui as perguntas do Tetsuo, para que fique mais visível para quem visita o blog: Há como fazer o binding com outras propriedades dos componentes, como ‘enabled’, ’selected’? Por exemplo chamar ‘form.setNome_enabled(false)’ para desabilitar um textfield. Isto seria perfeito para fazer ’subcutaneous testing’ da lógica das telas sem ter que instanciar componente visual algum, já que toda a lógica poderia ser feita diretamente no bean. [...]

  4. Alexjwfe disse:

    Hello, my name is Alex, i’m a newbie here. I really do like your resource and really interested in things you discuss here, also would like to enter your community, hope it is possible:-) Cya around, best regards, Alex!