eduardo guerra aplicações swing a jato
TRANSCRIPT
Eduardo Guerra
http://swingbean.sf.net
Aplicações Swing a Jato
Apresentação do Palestrante
Eduardo [email protected]
• Formado em Engenharia de Computação pelo ITA em 2002.
• Mestre pelo ITA, no curso de Engenharia Eletrônica e Computação, na área de Informática em 2005.
• Faz o curso de Doutorado no ITA com previsão de término para 2010.
• Professor da Graduação do ITA e da pós-graduação ITA-Stefanini.
• Possui as certificações da Sun: SCJA, SCJP, SCWCD, SCBCD (1.3 e 5.0), SCJWSD, SCMAD e SCEA.
• Possui experiência como Arquiteto de Software nas plataformas Java SE, Java EE e Java ME.
• Editor-chefe e autor de vários artigos da revista MundoJava.
• Administrador dos projeto open-source SwingBean e Esfinge.
Objetivo
Apresentar a abordagem do SwingBean para a criação de interfaces gráficas a
partir de metadados de objetos, mostrando como ele pode aumentar a produtividade em aplicações desktop.
• Dificuldades em Aplicações Swing
• Geração de Telas por XML
• Abordagem SwingBean
• Um Exemplo Simples
• O que Mais o SwingBean Pode Fazer?
• Geração de Templates
• O Futuro do SwingBean
Agenda da Apresentação
Aplicações em Swing
A API Swing é extremamente flexível e cheia de recursos, permitindo muitas extensões e a construção de interfaces realmente independente de plataforma.
public class FixedSizeFilter extends DocumentFilter { public void insertString(...) throws BadLocationException { replace(fb, offset, 0, str, attr); } public void replace(...) throws BadLocationException { int newLength = fb.getDocument().getLength() - length + str.length(); if (newLength <= 30) fb.replace(offset, length, str, attrs); }}
Porém este mesmo fator torna seu uso complexo e pouco trivial. Veja o código para criar um filtro que limita um campo de texto em 30 caracteres:
Dificuldades do Swing
• Pelo fato do Swing ser projetado para ser multiplataforma, os componentes deve ser posicionados de forma relativa e não de forma absoluta como em outras plataformas.
• Em uma tela com muitos componentes, tratalhar com a posição relativa dos componentes é trabalhoso, principalmente quando uma tela muda (exemplo: acrescentar um novo campo).
• A flexibilidade dos componentes muitas vezes deixa a execução de simples tarefas de interface complexas e com a necessidade de criação de várias classes.
• Cada componente gráfico tem suas particularidades, tendo grandes diferenças no tratamento de eventos e na configuração de cada um, o que exige um grande conhecimento de toda API.
• A lógica de criação da interface acaba ficando misturada com a lógica de apresentação e de negócios, havendo um grande trabalho para recuperar os dados de formulários e tabelas para os objetos de negócio.
Abordagem Clica & Arrasta
• Mesmo clicando e arrastando a construção de interfaces ainda é trabalhosa, pois cada componente ainda precisa ser posicionado e configurado.
• Ao se trabalhar diretamente no código, muitas ferramentas deixam de reconhecer a interface e não se consegue mais a edição visual dela.
• Ainda existe o mesmo trabalho braçal de se ligar as interfaces gráficas nos objetos de negócio.
Geração de Interface por XML
Esta abordagem facilita a construção da interface e o posicionamento dos componentes, porém ainda deve ser feita a ligação entre a interface e os objetos de negócio e muitas vezes se perde flexibilidade na construção das telas.
<panel gap="4" top="4" left="4"> <textfield name="number1" columns="4" /> <label text="+" /> <textfield name="number2" columns="4" /> <button text="=" action="calculate(number1.text, number2.text, result)" /> <textfield name="result" editable="false" /></panel>
Surgiram vários frameworks que descrevem a interface utilizando um documento XML, para facilitar a construção das telas.
Abordagem SwingBean
O SwingBean é um framework que fornece componentes de interface menos granulares e que são configurados
com metadados de objetos de negócio.
O formulário dessa tela é apenas um componente de interface e não vários!
O SwingBean não gera telas completas a partir de documentos XML!!!
Metadados do SwingBean
<beanDescriptor><line>
<property name='nome' label='Canino' /></line><line>
<property name='raca'comboList='Yorkshire;Beagle;Basset;Poodle' />
<property name='numeroCanil'/></line><line>
<property name='dataDeNascimento' /><property name='temPedigree'/>
</line></beanDescriptor>
Os metadados do SwingBean são configurados por um documento XML e são bem simples (existem só 3 tipos de entidade).
Os tipos de dados são reconhecidos automaticamente e os componentes são escolhidos de acordo.
É feito o posicionamento e o redimensionamento nos componentes de forma automática.
Metadados do SwingBean
<beanDescriptor><line>
<property name='nome' size='20' uppercase='true' /></line><line>
<property name='raca' label='Raça'comboList='Yorkshire;Beagle;Basset;Poodle' colspan='3' />
<property name='numeroCanil' /><property name='telefone' mask='(##)####-####' colspan='2' />
</line><line>
<property name='dataDeNascimento' format='dd/MM/yyyy' /><property name='temPedigree' dlu='55' />
</line></beanDescriptor>
Outros atributos podem ser utilizados para customizar o comportamento e tamanho de cada componente.
Manipulando o Formulário
GenericFieldDescriptor descriptor = XMLDescriptorFactory.getFieldDescriptor(Cachorro.class,
"cachorroForm.xml","CachorroForm");JBeanPanel<Cachorro> panel = new JbeanPanel<Cachorro>( Cachorro.class, descriptor);
Criando um Formulário
panel.setBean(cachorro);Setando um Objeto
Cachorro cao = new Cachorro();panel.populateBean(cao);
Recuperando um Objeto
panel.cleanForm();
Limpando o Formulário
Tabelas no SwingBean
<beanDescriptor><line>
<property name='nome' /><property name='raca' /><property name='dataDeNascimento' /><property name='temPedigree' />
</line></beanDescriptor>
As tabelas também podem ser construídas com base nos metadados A única diferença no XML é que ele só pode ter um elemento <line>
Se não for colocado o atributo readOnly=”true”, os campos da tabela são editáveis de acordo com os mesmos componentes que o formulário utiliza.
Manipulando a Tabela
TableFieldDescriptor tabledescriptor = XMLDescriptorFactory .getTableFieldDescriptor(Cachorro.class,
"cachorroTable.xml","CachorroTable");BeanTableModel<Cachorro> model = new BeanTableModel<Cachorro>(tabledescriptor);JBeanTable table = new JBeanTable(model);
Criando a Tabela
model.addBean(cachorro);model.setBeanList(list);
Colocando Objetos
Cachorro cao = model.getBeanAt(5);List<Cachorro> list = model.getCompleteList();
Recuperando Objetos
O que mais o SwingBean faz?
• Validação dos dados e adequação dos componentes do formulário baseado nos metadados do XML.
• Criação de componentes avançados como lista duplas, lista de checkbox e imagens.
• Adição de eventos em componentes de interface.
• Possui um pequeno framework para criação de ações de interface.
• Configuração de combos dependentes em formulários e tabelas.
O que mais o SwingBean faz?
• Validação de dados em tabelas, colocando a linha não válida em vermelho e mostrando os erros como tooltip.
• Recuperação de dados inseridos, atualizados e excluídos em tabelas para sincronização com o banco de dados.
• Filtragem e ordenação de dados em tabelas.
• Criação de tabelas-árvore, com 3 opções para a regra de formação das árvores.
• Customização de aparência para todos os componentes.
Geração de Templates
O segredo da produtividade com o SwingBean está na criação de templates de telas, visto que o que muda de uma tela para outra normalmente é o que está definido
nos metadados em XML.
Trocando o XML do formulário e da tabela, poucas modificações precisam ser feitas para que se tenham telas genéricas.
As diferenças mais comuns podem ser parametrizadas e as específicas inseridas por herança.
Futuro do SwingBean
• Como o XML do SwingBean é um metadado do objeto e não uma descrição da tela, será implementado o uso de anotações para a geração das telas.
• Vários comportamentos do SwingBean não podem ser facilmente alterados (como a forma que o label fica em relação ao componente). Aos poucos esses fatores estão sendo flexibilizados, para que se possa extender o framework mais facilmente.
• Como o SwingBean trabalha com componentes voltados a objetos de domínio, já está em implementação um mecanismo de binding para que se tenha objetos sincronizados com formulários e listas sincronizadas com tabelas.
• O uso de templates pode ser feito, porém não existe nenhum pronto pelo framework para ser utilizado. Depois de implementado o binding, serão criados vários templates para que se possa agilizar o desenvolvimento.
Frase Final
Muitas pessoas preferem o SwingBean do que
ferramentas vizuais de edição de tela, devido a facilidade de reuso da lógica de interface.