1 / 46

Desenvolvimento Orientado a Componentes e Reuso Construção de Componentes - JavaBeans

Desenvolvimento Orientado a Componentes e Reuso Construção de Componentes - JavaBeans. Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br. JavaBeans. Em Java, Bean significa Componente Tem dois modelos de componentes em Java:

lev
Download Presentation

Desenvolvimento Orientado a Componentes e Reuso Construção de Componentes - JavaBeans

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Desenvolvimento Orientado a Componentes e Reuso Construção de Componentes - JavaBeans Prof. Thiago Affonso de M. N. Viana thiago_affonso_viana@yahoo.com.br

  2. JavaBeans • Em Java, Bean significa Componente • Tem dois modelos de componentes em Java: • JavaBeans normais para componentes baseados em eventos • Frequentemente (mas não necessariamente) feitos para GUI • Enterprise JavaBeans (EJB) para Server Components • Não há relação entre os dois modelos

  3. O que é um JavaBean? • Portátil • Independente de plataforma • Orientado a componentes • Linguagem Java.

  4. Introdução • Foi bolado para permitir que componentes reutilizáveis pudessem ser compostos em outros JavaBeans, applets e componentes usando ferramentas visuais. • Embora seja possível fazer Beans não visuais, a composição é feita visualmente

  5. Conceitos Básicos • Uma ferramenta visual descobre as propriedades métodos e eventos de um Bean usando introspecção (olhar dentro do Bean) • Dizemos que as propriedades, métodos e eventos são expostos pelo Bean. • Propriedades correspondem a atributos de aparência e de comportamento que podem ser mudados em tempo de Design • Beans usam eventos para se comunicarem com outros Beans

  6. Conceitos Básicos • A persistência permite que um Bean salve seu estado e o restaure adiante • JavaBeans usa Object Serialization para implementar a persistência • Os métodos de um Bean não são diferentes de outros métodos em Java • Criar e manipular Beans é muito simples e pode ser feito por programadores humanos ou por ferramentas de design

  7. Propriedades • Simple Properties: • Representam tipos de dados simples • Podem ser nativos (int, String, ...) ou não. • Métodos devem se chamar get<NomePropriedade> e set<NomePropriedade> • Desta forma, a ferramenta visual infere que existe uma propriedade chamada "cor" que pode ser lida (get) e alterada (set): public Color getCor(); public void setCor(Color cor);

  8. Propriedades • Indexed Properties: • Contêm um array de valores possíveis • Métodos getter e setter são como para Simple Properties mas manipulam um array, ou recebem um índice a mais public String[] getEstados() public String getEstados(int índice) public void setEstados(String[] estados) public void setEstados(int índice, String estado)

  9. Propriedades • Bound Properties • Avisam outros objetos de mudanças nos seus valores • Uma mudança de valor gera um evento PropertyChangeEvent • Listeners deste evento serão notificados da mudança

  10. Propriedades • Constrained Properties • São como Bound Properties mas os Listeners podem vetar a mudança • Uma mudança aqui gera um evento VetoableChangeEvent

  11. Eventos • Os eventos possíveis são: • PropertyChangeEvent (para mudanças em Bound Properties) • VetoableChangeEvent (para mudanças em Constrained Properties)

  12. Eventos • Quem gera eventos PropertyChangeEvent deve implementar os seguintes métodos: public void addPropertyChangeListener(PropertyChangeListener pcl); public void removePropertyChangeListener(PropertyChangeListener pcl); • Quem gera eventos VetoableChangeEvent deve implementar os seguintes métodos: public void addVetoableChangeListener(VetoableChangeListener vcl); public void removeVetoableChangeListener(VetoableChangeListener vcl);

  13. Eventos • Quem gera eventos customizados deve implementar os seguintes métodos: public void add<Custom>Listener(<Custom>Listener cl); public void remove<Custom>Listener(<Custom>Listener cl); public void addMeuListener(MeuListener cl); public void removeMeuListener(MeuListener cl);

  14. Eventos • Os Beans Listener devem implementar a interface apropriada: • PropertyChangeListener: • Deve implementar o método PropertyChange (PropertyChangeEvent e) • VetoableChangeListener: • Deve implementar o método VetoableChange (VetoableChangeEvent e) • <Custom>Listener: • Deve implementar o método public Xpto (<CustomEvent> e);

  15. Criando um evento • Crie uma classe de evento: • Crie ou estenda uma classe e a nomeie (ex: ActionEvent) • Crie um event listener: • Crie ou use uma interface e uma classe que a implemente (ex: ActionListener) • Escreva a classe que origina o evento: • Adicione os método addXXListener e removeXXListener • Escreva uma classe conectora: • Crie uma classe que registre os eventos

  16. Exemplo: Button Handler

  17. 1. Crie uma classe de evento: • Vamos utilizar a classe ActionEvent já existente na JDK do Java

  18. 2. Crie um event listener: • Vamos usar a interface ActionListener já existente na JDK do Java • Vamos criar uma classe chamada ButtonHandler a qual irá implementar a interface ActionListener

  19. 2. Crie um event listener: public class ButtonHandler implements ActionListener{ // componente que irá conter mensagens sobre os eventos gerados private JTextArea output; // colocará as mensagens no textarea a cada evento recebido public ButtonHandler( JTextArea output ) { this.output = output; } // Ao receber uma notificação de evento, a mensagem será appended public void actionPerformed( ActionEvent event ) { this.output.append( "Action occurred in the Button Handler: " + event + '\n' ); } }

  20. 3. Escreva a classe que origina o evento • Vamos usar a classe Button já existente na JDK do Java • A classe Button já possui os métodos: • addActionListener • removeActionListener

  21. 4. Escreva uma classe conectora • Crie as instancias das classes a serem usadas • Registre o tratador do evento ao causador do evento

  22. 4. Escreva uma classe conectora public class ActionEventExample { public static void main(String[] args) { JFrame frame = newJFrame( "Button Handler" ); JTextArea area = newJTextArea( 6, 80 ); // criar o objeto gerador do evento JButton button = newJButton( "Fire Event" ); // registrar um objeto ActionListener à origem do evento button.addActionListener( new ButtonHandler( area ) ); frame.add( button, BorderLayout.NORTH ); frame.add( area, BorderLayout.CENTER ); frame.pack(); frame.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE); frame.setLocationRelativeTo( null ); frame.setVisible( true ); } }

  23. O que ocorre quando um evento acontece? • A origem do evento invoca o método handler do evento, o qual é esperado pelo eventListener registrado à origem • No nosso exemplo o acionamento do botão reage ao método actionPerformed do ButtonHandler

  24. Um Bean mínimo • Tem um construtor default • Implementa a interface Serializable • Para poder salvar o Bean customizado em tempo de design • Para entender melhor isso, veja a diferença entre a forma de instanciar objetos sem e com componentização • Quando usamos componentização, objetos podem ser instanciados em tempo de design e seus atributos podem ser alterados em tempo de design • É necessário ter serialização para poder obter os objetos novamente em tempo de execução

  25. Exemplo: SimpleBean import java.awt.Color; import java.beans.XMLDecoder; import javax.swing.JLabel; import java.io.Serializable; publicclass SimpleBean extends JLabel implements Serializable { public SimpleBean() { setText( "Hello world!" ); setOpaque( true ); setBackground( Color.RED ); setForeground( Color.YELLOW ); setVerticalAlignment( CENTER ); setHorizontalAlignment( CENTER ); } }

  26. Classes especiais para ajudar • PropertyChangeSupport e VetoableChangeSupport • Ajudam a mandar os eventos para todos os listeners e outras tarefas semelhantes

  27. Introspecção • É o processo automático de análise do bean, o qual, revela as suas propriedades, eventos e métodos • É suportado normalmente pela reflexão (comum ao Java), através de nomeação de métodos seguindo uma padronização: • set/getPropriedade(); • add/removeListener();

  28. Coisas que podem ser encontradas através de introspecção • Simple property • public void setPropertyName(PropertyType value); • public PropertyType getPropertyName(); • Boolean property • public void setPropertyName(boolean value); • public boolean isPropertyName(); • Indexed property • public void setPropertyName(int index, PropertyType value); • public PropertyType getPropertyName(int index); • public void setPropertyName(PropertyType[] value); • public PropertyType[] getPropertyName();

  29. Coisas que podem ser encontradas através de introspecção • Events • public void addEventListenerType(EventListenerType l); • public void removeEventListenerType(EventListenerType l); • public void addEventListenerType(EventListenerType l) throws TooManyListenersException; • public void removeEventListenerType(EventListenerType l) throws TooManyListenersException; • Methods • public methods

  30. Persistência • Através de serialização • Serialização de um objeto implica em converter o objeto em uma stream de dados e armazená-lo • Qualquer aplicação que use o bean pode assim “reconstituí-lo” através de uma deserialização

  31. Persistência com XML • A persistência, através de serialização de um componente JavaBeans pode ser implementado através de XML • Padrão para desenvolvimento • Padrão para criar padrões • Interpretação padronizada

  32. XMLEncoder • Permite que classes que geram objetos serializáveis sejam escritas como arquivos XML: XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream( new FileOutputStream( "Beanarchive.xml") ) ); encoder.writeObject( object ); encoder.close();

  33. XMLDecoder • Permite ler um arquivo XML que foi decodificado pela classe XMLEncoder: XMLDecoder decoder = new XMLDecoder( new BufferedInputStream( new FileInputStream( "Beanarchive.xml" ) ) ); Object object = decoder.readObject(); decoder.close();

  34. Criação de componentes com JavaBeans: Exemplo: Controle Remoto de uma TV

  35. Exemplo: Elementos Básicos • Para a TV • Um botão liga/desliga com luzinha mostrando o estado on/off • Botões Up/Down de mudança de canal • Não modelados aqui para simplificar • Uma tela • Um display do número de canal • Para o controle remoto • Um botão liga/desliga com luzinha mostrando o estado on/off • Botões Up/Down de mudança de canal • Uma ilha numérica (keypad)

  36. O Bean BotaoTVOnOff • Tem uma propriedade "on" (boolean) • Ao ser alterada com setOn(boolean estado), a luzinha muda de cor • É uma propriedade simples (pode ser bound) • Não avisa ninguém quando muda de valor • É listener de outras propriedades "on“ • Observar que clicar no botão não chama setOn()

  37. O Bean BotaoComum • Gera o evento ActionPerfomedEvent quando clicado • Não tem propriedade

  38. O Bean KeyPadTv • Tem 10 botões numéricos • O próprio Bean atende aos cliques desses botões e não os repassa para fora • Tem uma área para mostrar o valor temporário sendo digitado • Tem um botão ENTER • Para mudar a propriedade "valor" que recebe o valor temporário • A propriedade "valor" é bound para avisar outros Beans da mudança • Tem uma propriedade simples inteira informando o número máximo de dígitos que o keypad manipula

  39. O Bean Limites • Recebe um VetoableChangeEvent e veta se o valor não estiver nos limites apropriados • Os limites inferior e superior são propriedades simples • Ao aceitar um valor, a propriedade bound "valor" é alterada e os listeners são avisados

  40. O Bean TVDisplay • Trata da parte gráfica da TV • Liga e desliga a tela • Mostra o canal selecionado • Propriedades simples "on" e "canal" • Podem ser bound para ter generalidade (uso futuro)

  41. O Bean TVEstado • Propriedade bound "on" com métodos • getOn() • setOn() • onOff() // toggle da propriedade • Propriedade Constrained "canal" com métodos • getCanal() • setCanal() • incrementaCanal() • decrementaCanal()

  42. A Aplicação

  43. Construção da aplicação: Criação 1. Arraste um BotaoOnOff para o controle remoto e altere o label se desejar 2. Arraste dois OurButton para o controle remoto e altere os labels para Up e Down 3. Arraste um KeyPad para o controle remoto e altere o número de dígitos se desejar 4. Arraste um BotaoOnOff para a TV e altere o label se desejar 5. Arraste um TVEstado, TVDisplay e Limites para a TV 6. Altere os limites inferior e superior de Limites se desejar

  44. Construção da aplicação: Conexões 1. Liga/Desliga Remoto/ActionPerformed para TVEstado/OnOff (gera hookup) 2. Liga/Desliga TV/ActionPerformed para TVEstado/OnOff (gera hookup) 3. TVEstado/BindProperty/on para Liga/desliga Remoto/on 4. TVEstado/BindProperty/on para Liga/desliga TV/on 5. TVEstado/BindProperty/on para TVDisplay/on 6. Up/ActionPerformed para TVEstado/incrementaCanal (gera hookup)

  45. Construção da aplicação: Conexões 7. Down/ActionPerformed para TVEstado/decrementaCanal (gera hookup) 8. Keypad/BindProperty/valor para TVEstado/canal 9. TVEstado/Event/VetoableChange para Limites/vetoableChange (gera hookup) 10. Limites/BindProperty/valor para TVDisplay/canal

  46. Exercícios • Adicionar as funcionalidades aos botões de canais • Adicionar uma propriedade volume e botões para lidar com os volumes • Adicionar uma imagem a ser exibida para cada canal

More Related