You are on page 1of 24

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 1 de 24

Pesquisar

Home

Entenda o site

Revistas

Tecnologias

Cursos

Loja Virtual

Frum

Servios

Publicar
Fale conosco

Assine

Compre Crditos

Seja bem-vindo, JUAN CARLO DA CRUZ!

Meus Servios

Seufeedbackmuitoimportante!
Pedimos 1 minuto de sua ateno. Gostaramos de saber sua opinio sobre a ltima edio da(s) revista(s) que voc tem assinatura: Java Java Java Java Magazine Magazine Magazine Magazine 93 92 91 90 Clique Clique Clique Clique aqui aqui aqui aqui para para para para dar dar dar dar seu seu seu seu feedback feedback feedback feedback

Clique aqui para remover esta mensagem [X]

Voc tem acesso gratuito a este post. Se desejar compr-lo com Crditos DevMedia, clique aqui. d seu feedback

post favorito
Voc est em: canalJava +Java:artigos|vdeos| cursos|mais Publicidade

Artigo Java Magazine 43 - Introduo aos JavaBeans


Artigo publicado pela Java Magazine 43.
Tweet

Compartilhar

Esse artigo faz parte da revistaJavaMagazineedio43.Clique aqui para ler todos os artigos desta edio

Autor
Andr Dantas Rocha
mestre em Engenharia de Software pela USP, arquiteto e scio da Code Company

Mo na Massa

Space do autor

Introduo aos JavaBeans


Entenda e Use os Componentes Visuais Java Aprenda, passo a passo, a construir JavaBeans dos conceitos fundamentais a um exemplo completo A arquitetura baseada em componentes oferece diversas vantagens ao desenvolvimento. Combinando componentes especializados, possvel montar um sistema complexo com pouca ou nenhuma programao. Do ponto de vista arquitetural, componentes so como caixas pretas, que oferecem funcionalidades especficas e possuem comportamento conhecido, tendo sido testados e usados em outros projetos. No Java, os componentes so especificados atravs do padro JavaBeans, que define regras de implementao e empacotamento. Neste artigo apresentaremos os conceitos fundamentais dos JavaBeans e desenvolveremos um componente visual completo. Alm disso, veremos como configurar e instalar componentes na paleta de componentes do IDE NetBeans. Componentes em Java
Inclua

Estatsticas
Visualizaes: Favorito: Comentrios: Feedback: Utilidade: 0 0 2479 0 vez(es) 0

Servios
um comentrio aos Favoritos

Adicionar Marcar

como lido/assistido

Incluir anotao pessoal (ajuda)

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 2 de 24

Em Java um componente, denominado de JavaBean ou bean, um objeto que segue a especificao JavaBean. Essa especificao define uma API e dita regras de configurao e comunicao entre componentes e convenes de programao, alm de mecanismos de descoberta dinmica (que permitem inspecionar as caractersticas do componente). As classes e interfaces da API JavaBeans esto no pacote java.beans, mas diversas outras normalmente so utilizadas na criao de beans: java.util.EventObject, java.awt.event, java.io.Serializable, java.lang.reflect etc. De forma resumida, os JavaBeans tm as seguintes caractersticas:

D seu voto para este post Verso para impresso

Possuem um construtor sem argumentos Implementam java.io.Serializable Definem mtodos get/set para acesso s suas propriedades Definem mtodos add/remove para manipular listeners (detalhados adiante) So thread-safe

Os JavaBeans no so necessariamente visuais; por exemplo, so usados na sua forma mais simples no desenvolvimento web e Java EE. Neste artigo, no entanto, nosso enfoque na criao de um JavaBean visual, que faz uso de eventos e vrios outros recursos sofisticados da API JavaBeans e do Swing/AWT. Nosso JavaBean segue o estilo dos components ou widgets usados em ambientes de desenvolvimento como Delphi e VB. Um ponto interessante dos JavaBeans que eles podem ser manipulados diretamente nos IDEs e, portanto, suas propriedades podem ser alteradas tanto em tempo de projeto quanto de execuo. Alm disso, o IDE salva o estado do componente para edio posterior, preservando os valores definidos pelo usurio (por isso o bean deve ser serializvel). Propriedades Os atributos de um bean so denominados propriedades. Um bean pode conter propriedades de diversos tipos como por exemplo cor, tamanho, fonte etc. Para permitir a manipulao dessas propriedades (que definem o estado do bean), devem ser fornecidos mtodos de acesso get/set. O padro JavaBeans prev quatro tipos de propriedades: simples (valor nico), indexadas, bound (vinculadas) e constrained (restritas). Propriedades indexadas suportam um conjunto de valores que possuem, alm dos mtodos de acesso habituais (get/set), mtodos para acesso individual a cada elemento. Propriedades do tipo bound permitem que objetos sejam avisados quando for alterado o valor da propriedade em questo. Propriedades constraint permitem que a alterao seja vetada antes de ocorrer ( possvel impedir que a alterao acontea lanandose uma exceo java.beans.PropertyVetoException). Eventos A interao entre JavaBeans feita atravs de um modelo de eventos (event model) conhecido como modelo de delegao (delegation model). Esse modelo segue o pattern Observer: um objeto (denominado source) responsvel por criar o evento e dispar-lo. Os objetos interessados em receber notificaes sobre a ocorrncia do evento (listeners) se inscrevem e so avisados sempre que um evento ocorre, podendo agir sobre ele. Como veremos adiante, o objeto source (normalmente o bean) define mtodos para registrar listeners utilizando a conveno add/remove. Implementando JavaBeans Vamos passar construo de um exemplo completo. Desenvolveremos um TreeMap, que uma representao grfica planar de uma rvore a partir de um retngulo. O algoritmo que desenha a rvore (denominado slice and dice) efetua divises sucessivas do retngulo, de acordo com o valor atribudo a cada n[1]. Os ns so representados por retngulos e cada nvel da rvore desenhado em tonalidade distinta, o que permite enxergar simultaneamente diversos nveis. As Figuras de 1 a 5 mostram o funcionamento do TreeMap. Mais detalhes sobre a teoria por trs dos TreeMaps podem ser encontrados nas referncias ao final do artigo.

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 3 de 24

Figura 1. Estrutura de uma rvore e sua representao atravs de um TreeMap. Cada nvel da rvore desenhado em uma tonalidade distinta e a visualizao dos ns pode ser alterada atravs da tecla SHIFT e cliques nos botes do mouse (esquerdo ou direito). Inicialmente os ns SUDESTE e NORDESTE so exibidos (ambos os ns esto no nvel 2 da rvore).

Figura 2. Pressionando-se simultaneamente a tecla SHIFT e o boto esquerdo do mouse sobre o n NORDESTE, os filhos desse n so exibidos.

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 4 de 24

Figura 3. Pressionando-se simultaneamente a tecla SHIFT e o boto esquerdo do mouse sobre os ns SUDESTE, BAHIA e CEAR, os filhos de cada um dos ns so mostrados.

Figura 4. Pressionando-se simultaneamente a tecla SHIFT e o boto esquerdo do mouse sobre o n SALVADOR, os filhos desse n so exibidos: ITAPU e BARRA (ambos no nvel 5). O mesmo procedimento adotado sobre os ns SO PAULO e RIO DE JANEIRO, exibindo seus filhos.

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 5 de 24

Figura 5. Pressionando-se simultaneamente a tecla SHIFT e o boto direito do mouse sobre o n FORTALEZA (nvel 4), o pai desse n mostrado: CEAR (nvel 3). Para exibir o n SUDESTE (nvel 2) necessrio repetir o procedimento (SHIFT + boto direito) sobre um dos seus netos (por exemplo, CAMPINAS) e em seguida sobre um dos seus filhos (nesse caso, SO PAULO). Classes bsicas O JavaBean TreeMap mantm uma estrutura de rvore definida por duas classes: No e Arvore. A Listagem 1 mostra a classe br.com.jm.treemap.No, que representa um n da rvore. Um n possui diversas propriedades (como nome e valor), alm de mtodos utilitrios para manipulao de ns filhos. A Listagem 2 apresenta a classe br.com.jm.treemap.Arvore, que contm apenas uma referncia para o n raiz. A classe br.com.jm.treemap.TreeMap (Listagem 3) o JavaBean propriamente dito. A classe uma extenso de javax.swing.JPanel e possui cinco propriedades importantes, descritas na Tabela 1. Listagem 1. No.java package br.com.jm.treemap; import java.awt.*; import java.util.*; public class No { private int valor; private String nome; private No pai = null; private List filhos = new ArrayList(); private int[] superior = new int[2]; private int[] inferior = new int[2]; private boolean pintavel; private boolean selecionavel; private Color cor; private Random random = new Random(System.currentTimeMillis());

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 6 de 24

/* ... sets e gets omitidos */ public void setCor(Color cor) { this.cor = cor; propagarCor(); } // verifica se um ponto est contido no retngulo public boolean contem(double x, double y) { return (x >= inferior[0]) && (x <= superior[0]) && (y >= inferior[1]) && (y <= superior[1]); } public No(String nome, int valor) { this.nome = nome; this.valor = valor; } // pesquisa pelo nome // retorna o (possvel) pai do elemento public No pesquisarNo(String nome) { int i = 0; int tam = filhos.size(); No atual; if (tam <= 0) { return null; // lista vazia } else { atual = filhos.get(0); // no chegou ao fim e nome na lista menor... while ((i < tam) && !atual.getNome().equalsIgnoreCase(nome)) { atual = filhos.get(i); i++; } // no achou o nome if (i >= tam) { if (!atual.getNome().equalsIgnoreCase(nome)) { return null;

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 7 de 24

} else { return atual; // achou } } else { return atual; // achou } } } public No pesquisarNo(No no, Point pt) { if (no.contem(pt.x, pt.y)) { if (no.isSelecionavel()) { return no; } else { for (No filho : no.getFilhos()) { No temp = pesquisarNo(filho, pt); if (temp != null) { return temp; } } } } return null; } public void adicionarFilho(No novo) { novo.setSelecionavel(true); novo.setPintavel(true); novo.definirCor(); setSelecionavel(false); setPintavel(true); filhos.add(novo); } // calcula a soma de todos valores dos filhos public int calculaTamanho() {

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 8 de 24

for (No filho : filhos) { valor += filho.calculaTamanho(); } return valor; } public String toString() { return getNome() + " - " + getValor(); } public boolean possuiFilho() { return filhos.size() > 0; } public void definirCor() { if ((pai != null) && (pai.getCor() != null)) { cor = pai.getCor().brighter(); } else { cor = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)); } } private void propagarCor() { for (No filho : filhos) { filho.definirCor(); filho.propagarCor(); } } } Listagem 2. Arvore.java package br.com.jm.treemap; public class Arvore { private No raiz; public Arvore() {

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 9 de 24

raiz = new No("", 0); } public No getRaiz() { return raiz; } } Listagem 3. TreeMap.java package br.com.jm.treemap; import br.com.jm.treemap.evento.*; import br.com.jm.treemap.leitor.LeitorXML; import java.awt.*; import java.awt.event.MouseEvent; import java.io.*; import java.util.*; import javax.swing.JPanel; public class TreeMap extends JPanel implements Serializable { private static int CORTE_HORIZONTAL = 0; private static int AUMENTAR_NIVEL = MouseEvent.BUTTON1_MASK + MouseEvent.SHIFT_MASK; private static int DIMINUIR_NIVEL = MouseEvent.BUTTON3_MASK + MouseEvent.SHIFT_MASK; private Arvore arvore = new Arvore(); private File origemDados; private Color corBase = new Color(46, 95, 209); private Color corTexto = Color.black; private Color corBorda = Color.black; private boolean mostrarTexto = true; private LeitorXML leitorXML = new LeitorXML(); protected List listeners = new ArrayList(); public TreeMap() { this.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(MouseEvent e) {

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 10 de 24

processarEvento(e); } }); arvore.getRaiz().setCor(corBase); } public No getRaiz() { return arvore.getRaiz(); } /*** sets e gets omitidos ***/ public void setOrigemDados(File origemDados) { this.origemDados = origemDados; arvore = new Arvore(); arvore.getRaiz().setCor(corBase); leitorXML.processar(this); repaint(); } public void paintComponent(Graphics g) { // P e Q (arrays) so passados como parmetros para o // desenho do retngulo int[] superior = { 0, 0 }; // canto superior esquerdo int[] inferior = { 0, 0 }; // canto inferior direito // dimenses do Panel inferior[0] = this.getWidth(); inferior[1] = this.getHeight(); super.paintComponent(g); // se a rvore existir, desenha if (arvore.getRaiz() != null) { pintaArvore(arvore.getRaiz(), superior, inferior, CORTE_HORIZONTAL, arvore.getRaiz().getCor(), g); } }

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 11 de 24

public void pintaArvore(No no, int[] superior, int[] inferior, int eixo, Color cor, Graphics g) { if (no.isPintavel()) { int[] p = { 0, 0 }; int[] q = { 0, 0 }; // dados passados por valor System.arraycopy(superior, 0, p, 0, 2); System.arraycopy(inferior, 0, q, 0, 2); no.setInferior(new int[] { p[0], p[1] }); no.setSuperior(new int[] { q[0], q[1] }); g.setColor(cor); g.fillRect(p[0], p[1], q[0] - p[0], q[1] - p[1]); if (mostrarTexto) { g.setColor(corTexto); g.drawString(no.toString(), p[0] + 5, p[1] + 15); } g.setColor(corBorda); g.drawRect(p[0], p[1], q[0] - p[0], q[1] - p[1]); int larg = q[eixo] - p[eixo]; for (No filho : no.getFilhos()) { q[eixo] = p[eixo] + (int) (((float) filho.getValor() / (float) no.getValor()) * larg); pintaArvore(filho, p, q, 1 - eixo, filho.getCor(), g); p[eixo] = q[eixo]; } } } private void processarEvento(MouseEvent e) { No selecionado = arvore.getRaiz().pesquisarNo(arvore.getRaiz(), e.getPoint());

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 12 de 24

// SHIFT + boto esquerdo (diminui um nvel) if (e.getModifiers() == DIMINUIR_NIVEL) { No pai = selecionado.getPai(); if (pai != null) { pai.setSelecionavel(true); esconderNo(pai); } repaint(); avisarEvento(selecionado, pai != null); } // SHIFT + boto direito (aumenta um nvel) else if (e.getModifiers() == AUMENTAR_NIVEL) { if (selecionado.possuiFilho()) { selecionado.setSelecionavel(false); for (No filho : selecionado.getFilhos()) { filho.setSelecionavel(true); filho.setPintavel(true); } } repaint(); avisarEvento(selecionado, selecionado.possuiFilho()); } // boto esquerdo apenas (seleciona o n) else if (e.getModifiers() == MouseEvent.BUTTON1_MASK) { avisarEvento(selecionado, false); } } public void print() { arvore.print(arvore.getRaiz(), ""); } private void esconderNo(No no) { for (No filho : no.getFilhos()) { filho.setSelecionavel(false); filho.setPintavel(false); esconderNo(filho); }

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 13 de 24

} public void addTreeMapListener(TreeMapListener listener) { listeners.add(listener); } public void removeTreeMapListener(TreeMapListener listener) { listeners.remove(listener); } private void avisarEvento(No no, boolean nivelAlterado) { TreeMapEvent evento = new TreeMapEvent(no, nivelAlterado); List lista = Collections.unmodifiableList(listeners); for (TreeMapListener listener : lista) { listener.noSelecionado(evento); } } } Propriedade origemDados Tipo java.io.File Significado Arquivo XML contendo os dados utilizados para popular a rvore. corBase java.awt.Color Cor utilizada para o primeiro n da rvore. A cor ter sua tonalidade alterada medida que o nvel da rvore for mudando. corTexto corBorda mostrarTexto java.awt.Color Cor utilizada para os textos. java.awt.Color Cor utilizada para as bordas. boolean Indica se o texto (contendo o nome e valor do n) deve ser exibido. Tabela 1. Seleo de propriedades do JavaBean O desenho da rvore feito atravs do mtodo paintComponent(), que redefinido (overridden). Esse mtodo definido primeiramente na classe javax.swing.JComponent, e chamado automaticamente pelo Swing sempre que necessrio desenhar ou redesenhar um componente grfico. Com a redefinio, o mtodo executa uma chamada ao pintaArvore(), passando como parmetros o n, o retngulo a ser pintado, a direo de corte (horizontal ou vertical) e o grfico. O mtodo recursivo e percorre todos os ns da rvore. Como possvel observar nas de Figura 1 a 5, o TreeMap permite a visualizao simultnea de diversos nveis. Isso conseguido pressionando-se a tecla SHIFT e o boto apropriado do mouse: SHIFT + boto esquerdo aumenta o nvel a partir do n atual; SHIFT + boto direito diminui. Para tornar essas operaes possveis, um MouseEvent foi registrado no construtor da classe:

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 14 de 24

this.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(MouseEvent e) { processarEvento(e); } }); O mtodo processarEvento() disparado sempre que algum boto do mouse for clicado. A anlise do evento permite decidir que ao tomar (aumentar ou diminuir o nvel de visualizao). Eventos e listeners As classes java.awt.event.MouseAdapter e java.awt.event.MouseEvent so exemplos de classes que implementam o modelo de eventos do Java (MouseAdapter um listener de eventos do mouse; MouseEvent representa o evento do mouse). Alm dos diversos eventos existentes na linguagem, possvel criar eventos personalizados e registrar observadores, que sero notificados sempre que um evento especfico ocorrer. Os eventos devem ser classes que descendem de java.util.EventObject (direta ou indiretamente) e, por conveno, usam o sufixo Event no seu nome. Criaremos aqui um evento que disparado sempre que um n selecionado. A Listagem 4 exibe a classe br.com.jm.treemap.evento.TreeMapEvent, que encapsula os dados do evento: o n que foi selecionado e uma indicao se houve ou no mudana de nvel[2]. Qualquer objeto que deseje ser notificado quando o evento do TreeMap ocorrer (listener), deve implementar a interface br.com.jm.treemap.evento.TreeMapListener (Listagem 5). Esta interface define o mtodo noSelecionado(), a partir do qual possvel recuperar os dados do evento gerado. Para criar um listener de eventos necessrio implementar a interface java.util.EventListener. A classe br.com.jm.treemap.TreeMap (Listagem 3) responsvel por criar o evento no momento apropriado e avisar aos observadores que o evento ocorreu. O TreeMap mantm os observadores em uma lista, que manipulada pelos mtodos addTreeMapListener() e removeTreeMapListener() (os prefixos add e remove so definidos na nomenclatura padro de JavaBeans). O mtodo avisarEvento() notifica os observadores sobre a ocorrncia do evento. Esse mtodo simplesmente percorre a lista de observadores e dispara o mtodo noSelecionado() para cada um. Cada observador pode ento efetuar a lgica desejada. Listagem 4. TreeMapEvent.java package br.com.jm.treemap.evento; import java.util.EventObject; import br.com.jm.treemap.No; public class TreeMapEvent extends EventObject { private boolean nivelAlterado;

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 15 de 24

public TreeMapEvent(No no, boolean nivelAlterado) { super(no); this.nivelAlterado = nivelAlterado; } public boolean nivelAlterado() { return nivelAlterado; } } Listagem 5. TreeMapListener.java package br.com.jm.treemap.evento; import java.util.EventListener; public interface TreeMapListener extends EventListener { public void noSelecionado(TreeMapEvent e); } Propriedades e Editores J temos uma verso funcional do componente. Falta apenas empacot-lo em um arquivo JAR. A gerao do arquivo TreeMap.jar feita atravs de um script Ant, disponvel para download junto com os fontes do exemplo, no site da Java Magazine. O pacote gerado pode ser adicionado a qualquer IDE. Aqui usaremos o NetBeans devido a sua facilidade de customizao. O quadro Adicionando componentes ao NetBeans explica como adicionar novos componentes paleta desse IDE (informaes sobre adio de componentes ao Visual Editor do Eclipse podem ser encontradas nas referncias ao final do artigo).

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 16 de 24

Figura 6. Utilizando o TreeMap no NetBeans. Observe que possvel visualizar a rvore em tempo de projeto, apenas preenchendo a propriedade origemDados. A Figura 6 mostra o uso do nosso JavaBean no NetBeans. Apesar de o bean poder ser utilizado em aplicaes Swing de forma simples (basta arrastar e soltar sobre a tela e editar suas propriedades), alguns problemas so evidentes. Como possvel perceber na figura, o painel de propriedades do bean (exibido sempre que o componente selecionado) exibe muitas propriedades, inclusive todas aquelas herdadas de JPanel e suas superclasses. Alm disso, o nome de cada propriedade mostrada corresponde ao nome do atributo: corBase, corBorda, corTexto e origemDados (uma apresentao pouco amigvel). A edio das propriedades constitui mais um problema. As propriedades de um bean so editadas atravs de classes que implementam a interface java.beans.PropertyEditor, e os IDEs oferecem editores bsicos para os tipos usuais (perceba os editores dos atributos do tipo java.awt.Color e boolean). Objetos mais complexos, como java.io.File, no possuem editores default, o que torna a edio de propriedades desse tipo uma tarefa manual o nome do arquivo de dados, por exemplo, deve ser digitado. Por fim um outro inconveniente: um cone padro utilizado na paleta de objetos para referenciar o nosso TreeMap, quando o melhor seria um cone customizado. Todos esses problemas ocorrem porque no foi executada nenhuma customizao sobre a forma como o bean deve ser apresentado. Assim, o IDE buscar as informaes do bean atravs de reflexo e criar uma apresentao padro. Nesse caso todas as propriedades do bean e de suas superclasses sero consideradas. O processo utilizado para descobrir as caractersticas do bean denomina-se introspeco, e executado atravs da classe java.beans.Introspector, utilizada pelo IDE para inspecionar o bean em edio. Pela especificao JavaBeans, cada bean deve fornecer uma classe que expe as suas propriedades. A classe responsvel pelas informaes sobre o bean deve implementar a interface java.beans.BeanInfo e ser nomeada com o sufixo BeanInfo. Essa classe possui mtodos especficos que sero utilizados pela classe java.beans.Introspector para customizar a exibio das propriedades do bean. Editores personalizados Para personalizar a exibio das propriedades do bean necessrio implementar um BeanInfo. A Listagem 6 mostra a classe br.com.jm.treemap.TreeMapBeanInfo responsvel por expor as caractersticas do nosso bean. Essa classe herda de java.beans.SimpleBeanInfo (uma

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 17 de 24

implementao simples de java.beans.BeanInfo) e implementa trs mtodos importantes: getPropertyDescriptors(), getBeanDescriptor() e getIcon(). Os dois ltimos mtodos so simples: o mtodo getBeanDescriptor() retorna informaes do bean (nome e descrio), enquanto o mtodo getIcon() retorna a sua representao visual. Esse mtodo chamado pelo IDE e retorna a imagem apropriada de acordo com um parmetro que define o tamanho e a cor desejada (colorida ou monocromtica, 16x16 ou 32x32 pixels). O mtodo getPropertyDescriptors() exige uma explicao um pouco mais detalhada. Ele retorna um array contendo as descries de todas as propriedades que devem ser expostas. Cada descrio encapsulada em um objeto do tipo java.beans.PropertyDescriptor, que permite alterar o nome a ser exibido e o editor que ser utilizado. Para a propriedade corBase, por exemplo, utilizamos a exibio Cor base, no sendo necessrio definir um editor (o NetBeans j prov um editor para propriedades do tipo cor): PropertyDescriptor corBase = new PropertyDescriptor("corBase", treemap); corBase.setDisplayName("Cor base"); O atributo origemDados (do tipo java.io.File) no possui um editor padro e, portanto, necessrio especific-lo com setPropertyEditorClass(): PropertyDescriptor origemDados = new PropertyDescriptor("origemDados", treemap); origemDados.setDisplayName("Origem dos dados"); origemDados.setPropertyEditorClass(OrigemDadosEditor.class); O editor para a propriedade origemDados definido pela classe br.com.jm.treemap.editor.OrigemDadosEditor (Listagem 7), que implementa um editor de propriedade para arquivos. O editor permite selecionar arquivos de forma amigvel, atravs de um javax.swing.JFileChooser. Listagem 6. TreeMapBeanInfo.java package br.com.jm.treemap; import br.com.jm.treemap.editor.OrigemDadosEditor; import java.beans.*; public class TreeMapBeanInfo extends SimpleBeanInfo { private static final Class treemap = TreeMap.class; private static final String NOME_ICONE = "/br/com/jm/treemap/resource/icon16x16.gif"; private static java.awt.Image ICONE = null; public PropertyDescriptor[] getPropertyDescriptors() {

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 18 de 24

PropertyDescriptor[] descritores = null; try { PropertyDescriptor corBase = new PropertyDescriptor( "corBase", treemap); corBase.setDisplayName("Cor base"); PropertyDescriptor corTexto = new PropertyDescriptor( "corTexto", treemap); corTexto.setDisplayName("Cor do texto"); PropertyDescriptor corBorda = new PropertyDescriptor( "corBorda", treemap); corBorda.setDisplayName("Cor da borda"); PropertyDescriptor mostrarTexto = new PropertyDescriptor( "mostrarTexto", treemap); mostrarTexto.setDisplayName("Mostrar texto"); PropertyDescriptor origemDados = new PropertyDescriptor( "origemDados", treemap); origemDados.setDisplayName("Origem dos dados"); origemDados.setPropertyEditorClass(OrigemDadosEditor.class); descritores = new PropertyDescriptor[] { corBase, corTexto, corBorda, mostrarTexto, origemDados }; } catch (IntrospectionException e) { e.printStackTrace(); } return descritores; } public BeanDescriptor getBeanDescriptor() { BeanDescriptor descriptor = new BeanDescriptor(treemap); descriptor.setShortDescription("Java TreeMap");

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 19 de 24

descriptor.setDisplayName("JTreeMap"); return descriptor; } public java.awt.Image getIcon(int tipoIcone) { if (tipoIcone == ICON_COLOR_16x16) { if (NOME_ICONE == null) return null; else { if (ICONE == null) ICONE = loadImage(NOME_ICONE); return ICONE; } } return null; } } Listagem 7. OrigemDadosEditor.java package br.com.jm.treemap.editor; import java.awt.Component; import java.beans.PropertyEditorSupport; import java.io.File; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; public class OrigemDadosEditor extends PropertyEditorSupport { private File arquivo; private Seletor seletor; public String getAsText() { return arquivo == null ? "" : arquivo.getAbsolutePath().replace('\\', '/'); } public void setAsText(String texto) throws IllegalArgumentException { setValue(new File(texto)); }

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 20 de 24

public Object getValue() { return arquivo; } public void setValue(Object value) { arquivo = ((File) value); super.setValue(arquivo); if (seletor != null) { seletor.setSelectedFile(arquivo); } } public boolean supportsCustomEditor() { return true; } public Component getCustomEditor() { if (seletor == null) { seletor = new Seletor(); seletor.setFileFilter(new FileFilter() { public boolean accept(File arquivo) { return arquivo != null && (arquivo.isDirectory() || (arquivo.isAbsolute() && arquivo .getName().toLowerCase().endsWith(".xml"))); } public String getDescription() { return "Arquivos TreeMap"; } }); } return seletor; } public String getJavaInitializationString() { return ("new java.io.File(\"" + getAsText() + "\")"); }

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 21 de 24

private class Seletor extends JFileChooser { public void approveSelection() { super.approveSelection(); setValue(getSelectedFile()); } } } Os editores de propriedades devem implementar a interface java.beans.PropertyEditor ou herdar da classe java.beans.PropertyEditorSupport, que oferece uma implementao default. O editor instanciado automaticamente pelo IDE, e associado propriedade em edio (neste caso, origemDados). O mtodo setAsText() converte um valor do tipo String para java.io.File e o atribui propriedade (esse mtodo disparado caso o arquivo seja digitado manualmente). O mtodo getAsText(), por sua vez, efetua o processo inverso, convertendo o arquivo para uma representao textual. O mtodo getValue() retorna o arquivo selecionado; setValue() atribui o arquivo propriedade (a chamada ao super.setValue() permite manter o comportamento padro da classe pai java.beans.PropertyEditorSupport antes de executar as operaes especficas do editor). Dois mtodos so responsveis pela seleo do arquivo: supportsCustomEditor() indica que um editor personalizado (javax.swing.JFileChooser) ser usado na edio; getCustomEditor() cria e retorna esse editor. Sempre que a propriedade origemDados for alterada, o IDE criar automaticamente o trecho correspondente no editor de cdigos. O cdigo gerado ser semelhante a esse: treeMap1.setOrigemDados(new java.io.File("C:/Java/arvore.xml")); O mtodo getJavaInitializationString() responsvel por gerar esse trecho a partir do arquivo selecionado: public String getJavaInitializationString() { return ("new java.io.File(\"" + getAsText() + "\")"); } A codificao do BeanInfo e do editor tornam a manipulao do bean bem mais simples. A Figura 7 mostra a nova interface de edio.

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 22 de 24

Figura 7. Utilizando o TreeMap no NetBeans, com o descritor do Bean. Concluses Neste artigo apresentamos uma pequena introduo ao universo dos JavaBeans. A arquitetura de JavaBeans oferece recursos avanados para o desenvolvimento de componentes. Beans podem ser construdos em diferentes nveis de complexidade e customizao e permitem configurao tanto em tempo de projeto quanto de execuo. A possibilidade de configurar o componente lhe confere vrias faces, que podem ser utilizadas em diferentes situaes. Quando bem projetados, os JavaBeans diminuem consideravelmente o tempo de desenvolvimento e teste. Adicionando componentes ao NetBeans Alm de oferecer um conjunto de recursos para o desenvolvimento de JavaBeans, uma das grandes vantagens do IDE NetBeans a facilidade com que novos componentes podem ser instalados na sua paleta. Para adicionar nosso TreeMap ao NetBeans, basta seguir os passos abaixo: 1) Abra ou crie um projeto visual (com interface grfica Swing), e clique com o boto direito na janela Palette e escolha a opo Palette Manager; 2) Na janela Palette Manager, clique em Add from JAR; 3) Selecione o arquivo TreeMap.jar na sua estrutura de diretrios e clique em Next; 4) Selecione TreeMap na caixa Available Components e clique em Next; 5) Selecione a categoria desejada na caixa Palette Categories e clique em Finish; Na janela Palette Manager, clique em Close. O novo componente estar disponvel na janela Palette, na categoria escolhida. Livros Developing Java Beans, Robert Englander (O'Reilly) tima referncia sobre JavaBeans

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 23 de 24

Links www.cs.umd.edu/hcil/treemap-history Introduo aos TreeMaps java.sun.com/products/javabeans/docs/spec.html Especificao dos JavaBeans java.sun.com/j2se/1.5.0/docs/api/java/beans/package-summary.html API de JavaBeans eclipse.org/articles/Article-VE-Custom-Widget/customwidget.html Adicionando JavaBeans ao Visual Editor (Eclipse)

[1] Cada n possui um nome e um valor numrico. Esse valor utilizado pelo algoritmo para definir a largura do retngulo que representa o n. A cada mudana de nvel, o n pai fatiado para que os ns filhos sejam desenhados. A cada diviso, a direo de corte trocada. Assim se no 1 nvel o corte foi vertical, no 2 nvel ser horizontal, no 3 vertical novamente e assim sucessivamente. [2] A mudana de nvel s executada quando a tecla SHIFT estiver pressionada e o boto do mouse for pressionado. Alm disso, necessrio que o n selecionado possua filhos (caso o boto esquerdo do mouse seja pressionado) ou pai (caso o boto direito do mouse seja pressionado).

0COMENTRIO

Nenhum comentrio foi postado - seja o primeiro a comentar!

cursos relacionados

posts em sequncia

ltimos do autor

ltimos do site

(tutorial) Aprenda a persistir dados em suas aplicaes Java utilizando Hibernate Introduo a Design Patterns Formao Java web Developer Curso online: Introduo ao desenvolvimento para celulares com J2ME Curso OnLine - Introduo ao Ruby on Rails (em andamento) Java ME e Banco de Dados PHP Curso OnLine WebDesign - Desenvolvendo o layout de um WebSite passo a passo PostGreSQL [Ver todos]

sobre
a DevMedia faz parte do grupo www.web-03.net

tecnologias
Delphi Java .net Banco de dados ASP WebDesign Engenharia de Software Linux

servios
Cadastre-se Sistema de Crditos Programa DevBonus Programa DeveloperAds

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

Artigo Java Magazine 43 - Introduo aos JavaBeans

Pgina 24 de 24

www.devmedia.com.br www.linhadecodigo.com.br www.javafree.org www.mrbool.com

Mobile Ruby on Rails PHP

Scripting Automao / NFe / PAF-ECF Outros

Programa PayContent DevMedia Player Loja Virtual Publique seu post

publicaes
ClubeDelphi Java Magazine .net Magazine easy Java Magazine easy .net Magazine Mobile magazine SQL Magazine Engenharia de Software Infra Magazine
anuncie conosco |fale conosco - (21) 3382-5038 2011 - Todos os Direitos Reservados a DevMedia

http://www.devmedia.com.br/articles/viewcomp.asp?comp=8621

28/07/2011

You might also like