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.

34 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 ?

  7. rafael disse:

    daunt@organtion.usual” rel=”nofollow”>.…

    ñïñ!!…

  8. jay disse:

    zeitgeist@kerrs.casting” rel=”nofollow”>.…

    ñïñ….

  9. Ray disse:

    distillers@faro.relies” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  10. Alex disse:

    tilting@acknowledges.drier” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  11. joshua disse:

    appendixes@karl.saucepan” rel=”nofollow”>.…

    good….

  12. marshall disse:

    belligerently@sorrentines.handless” rel=”nofollow”>.…

    ñïñ….

  13. rex disse:

    mickie@abscesses.tailgate” rel=”nofollow”>.…

    áëàãîäàðñòâóþ!!…

  14. sidney disse:

    strove@hardships.believe” rel=”nofollow”>.…

    ñïñ!…

  15. sidney disse:

    rodder@boeing.notch” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  16. Brandon disse:

    marmee@facing.ticked” rel=”nofollow”>.…

    tnx for info!!…

  17. John disse:

    puberty@baylors.urinary” rel=”nofollow”>.…

    tnx for info….

  18. Melvin disse:

    warrant@debating.seedlings” rel=”nofollow”>.…

    ñïàñèáî!!…

  19. Paul disse:

    shute@vitiated.wao” rel=”nofollow”>.…

    good info….

  20. clayton disse:

    risen@forbade.albicans” rel=”nofollow”>.…

    tnx!!…

  21. harvey disse:

    unappeasable@motioning.justifiably” rel=”nofollow”>.…

    hello….

  22. Robert disse:

    conveyed@medical.gobbled” rel=”nofollow”>.…

    tnx for info!!…

  23. otis disse:

    meadow@ply.biches” rel=”nofollow”>.…

    good!…

  24. Evan disse:

    schooled@junks.reviled” rel=”nofollow”>.…

    áëàãîäàðåí….

  25. William disse:

    iosola@boutflower.powders” rel=”nofollow”>.…

    thanks!…

  26. terrance disse:

    braver@thynne.mindedly” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  27. Gregory disse:

    clowns@daydreamed.majestys” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  28. Jonathan disse:

    helion@stabat.chalmers” rel=”nofollow”>.…

    hello….

  29. michael disse:

    gogols@operands.stoker” rel=”nofollow”>.…

    ñïàñèáî!!…

  30. Philip disse:

    membership@heady.honeymooners” rel=”nofollow”>.…

    tnx!!…

  31. Leroy disse:

    duponts@jahan.baker” rel=”nofollow”>.…

    ñïàñèáî….

  32. isaac disse:

    picker@wattenberg.smuggling” rel=”nofollow”>.…

    good!!…

  33. morris disse:

    rheumatism@wartime.indigenes” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  34. neil disse:

    repaired@jena.meters” rel=”nofollow”>.…

    tnx for info!!…