genesis 3.0-EA4: Suporte SWT e tutorial pelo Edgar

Foi lançada alguns dias atrás a nova release do genesis, a 3.0-EA4. Uma das novidades é o binding SWT, expandindo o suporte desktop do framework, que já inclui Swing (desde a 3.0-EA3) e Thinlet.

O princípio do binding é o mesmo usado pelas outras tecnologias: você constrói sua interface normalmente, usando o Visual Editor do Eclipse ou codificando na mão mesmo, com o único requerimento de definir o nome dos seus componentes igual ao da propriedade ou ação com o que você deseja ligá-lo. No caso do SWT, usamos a propriedade data dos componentes como seu nome, mas isto pode ser mudado.

Escrever uma tela de login em SWT com o genesis é bem fácil. Primeiro definimos o form, que é o mesmo independente da tecnologia de GUI utilizada:


@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 depois o código que constrói a GUI SWT e faz a ligação com o form:


@ViewHandler
public class LoginSWTView {
   private Shell shell = null;
   private Composite composite = null;
   private Label labelUsuario = null;
   private Text usuario = null;
   private Label labelSenha = null;
   private Text senha = null;
   private Composite compositeBotoes = null;
   private Button limpar = null;
   private Button login = null;

   public LoginSWTView() {
      createShell();
      SWTBinder binder = new SWTBinder(shell, new LoginForm(), this);
      binder.bind();
   }

   private void createShell() {
      shell = new Shell();
      shell.setText("Login");
      createComposite();
      createCompositeBotoes();
      shell.setLayout(new GridLayout());

      shell.pack();
   }

   private void createComposite() {
      GridLayout gridLayout = new GridLayout();
      gridLayout.numColumns = 2;

      GridData gridData = new GridData();
      gridData.horizontalAlignment = GridData.FILL;
      gridData.verticalAlignment = GridData.FILL;

      composite = new Composite(shell, SWT.NONE);
      composite.setLayoutData(gridData);
      composite.setLayout(gridLayout);

      labelUsuario = new Label(composite, SWT.NONE);
      labelUsuario.setText("Usuário");

      usuario = new Text(composite, SWT.BORDER);
      usuario.setData("usuario");

      labelSenha = new Label(composite, SWT.NONE);
      labelSenha.setText("Senha");

      senha = new Text(composite, SWT.BORDER | SWT.PASSWORD);
      senha.setData("senha");
   }

   private void createCompositeBotoes() {
      RowLayout rowLayout = new RowLayout();
      rowLayout.fill = true;

      GridData gridData = new GridData();
      gridData.horizontalAlignment = GridData.END;
      gridData.verticalAlignment = GridData.FILL;

      compositeBotoes = new Composite(shell, SWT.NONE);
      compositeBotoes.setLayoutData(gridData);
      compositeBotoes.setLayout(rowLayout);

      limpar = new Button(compositeBotoes, SWT.NONE);
      limpar.setText("Limpar");
      limpar.setData("limpar");

      login = new Button(compositeBotoes, SWT.NONE);
      login.setText("Login");
      login.setData("login");
   }

   public void display() throws Exception {
      final Display display = Display.getDefault();
      Rectangle bounds = display.getBounds();
      shell.setLocation(bounds.x
            + (bounds.width - shell.getBounds().width) / 2, bounds.y
            + (bounds.height - shell.getBounds().height) / 2);

      shell.open();
      shell.forceActive();

      while (!shell.isDisposed()) {
         if (!display.readAndDispatch()) {
            display.sleep();
         }
      }

      display.dispose();
   }

   public static void main(String[] args) throws Exception {
      new LoginSWTView().display();
   }
}

Outra novidade é que, atendendo aos pedidos de diversos usuários, agora é possível utilizar a parte client do genesis simplesmente colocando os jars no classpath. O Edgar postou no seu blog, de forma bem didática, como funciona o binding e como utilizá-lo com Swing num sistema de locadora. Vale a pena conferir.

Caso tenham sugestões ou dúvidas a respeito do genesis, podem perguntar aqui no blog ou na lista de discussão do projeto, conforme explicado na doc em português do framework.

6 Responses to “genesis 3.0-EA4: Suporte SWT e tutorial pelo Edgar”

  1. Leonardo disse:

    Muito legal o Genesis Mister M. Parabéns pelo seu trabalho

  2. Michael Nascimento Santos disse:

    Obrigado, Leonardo, mas diversas outras pessoas merecem crédito, como o Allan Jones, Raphael Bettio, Liaw Mike, Pablo Madril e outros que ajudam, como o Edgar Silva.

  3. Sandokan Dias disse:

    Estou interessado no Genesis, porem nao achei um tutorial para instalação e configuração…

  4. Michael Nascimento Santos disse:

    Ola Sandokan,

    Verifique se a página “Desenvolvendo com o genesis para desktops” não contém as instruções que você deseja. Caso tenha alguma dúvida, você pode perguntar na lista de usuários do genesis, usuarios@genesis.dev.java.net.

  5. Sandokan Dias disse:

    obrigado Michael, foi barberada minha… tava na cara o tutorial…

  6. Sandokan Dias disse:

    Michael,

    no artigo do EDGAR sobre SWING, os códigos não aparecem, fica como se tudo tivesse criptografado.

    Ex:

    PLAIN TEXT
    CODE:
    1- cHVibGljIGNsYXNzIEZpbG1lIHsg

    vc sabe pq ?