desenvolvimento orientado a componentes e reuso construção de componentes - javabeans

46
Desenvolvimento Orientado a Componentes e Reuso Construção de Componentes - JavaBeans Prof. Thiago Affonso de M. N. Viana [email protected]

Upload: lev

Post on 05-Jan-2016

29 views

Category:

Documents


3 download

DESCRIPTION

Desenvolvimento Orientado a Componentes e Reuso Construção de Componentes - JavaBeans. Prof. Thiago Affonso de M. N. Viana [email protected]. JavaBeans. Em Java, Bean significa Componente Tem dois modelos de componentes em Java: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 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 [email protected].

br

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

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

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

O que é um JavaBean?

• Portátil• Independente de plataforma• Orientado a componentes • Linguagem Java.

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

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

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

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

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

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

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

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);

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

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)

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

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

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

Propriedades

• Constrained Properties – São como Bound Properties mas os Listeners

podem vetar a mudança– Uma mudança aqui gera um evento

VetoableChangeEvent

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

Eventos

• Os eventos possíveis são:– PropertyChangeEvent (para mudanças em

Bound Properties)– VetoableChangeEvent (para mudanças em

Constrained Properties)

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

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);

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

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);

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

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);

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

Criando um evento

1. Crie uma classe de evento:• Crie ou estenda uma classe e a nomeie (ex:

ActionEvent)

2. Crie um event listener:• Crie ou use uma interface e uma classe que a

implemente (ex: ActionListener)

3. Escreva a classe que origina o evento:• Adicione os método addXXListener e

removeXXListener

4. Escreva uma classe conectora:• Crie uma classe que registre os eventos

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

Exemplo: Button Handler

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

1. Crie uma classe de evento:

• Vamos utilizar a classe ActionEvent já existente na JDK do Java

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

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

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

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' );

}

}

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

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

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

4. Escreva uma classe conectora

• Crie as instancias das classes a serem usadas

• Registre o tratador do evento ao causador do evento

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

4. Escreva uma classe conectorapublic class ActionEventExample {

public static void main(String[] args) {

JFrame frame = new JFrame( "Button Handler" );

JTextArea area = new JTextArea( 6, 80 );

// criar o objeto gerador do evento

JButton button = new JButton( "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 );

}

}

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

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

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

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

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

Exemplo: SimpleBeanimport java.awt.Color;

import java.beans.XMLDecoder;

import javax.swing.JLabel;

import java.io.Serializable;

public class SimpleBean extends JLabel implements Serializable {

public SimpleBean() {

setText( "Hello world!" );

setOpaque( true );

setBackground( Color.RED );

setForeground( Color.YELLOW );

setVerticalAlignment( CENTER );

setHorizontalAlignment( CENTER );

}

}

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

Classes especiais para ajudar

• PropertyChangeSupport e VetoableChangeSupport– Ajudam a mandar os eventos para todos os

listeners e outras tarefas semelhantes

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

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();

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

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();

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

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

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

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

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

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

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

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();

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

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();

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

Criação de componentes com JavaBeans:

Exemplo:

Controle Remoto de uma TV

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

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)

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

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()

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

O Bean BotaoComum

• Gera o evento ActionPerfomedEvent quando clicado

• Não tem propriedade

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

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

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

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

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

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)

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

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()

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

A Aplicação

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

Construção da aplicação: Criação1. 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

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

Construção da aplicação: Conexões1. 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)

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

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

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

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