| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <title>Introdução à Plataforma NetBeans para Plataformas NetBeans 6.8</title> |
| <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/> |
| <meta name="AUDIENCE" content="NBUSER"/> |
| <meta name="TYPE" content="ARTICLE"/> |
| <meta name="EXPIRES" content="N"/> |
| <meta name="developer" content="gwielenga@netbeans.org"/> |
| <meta name="indexed" content="y"/> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta name="description" |
| content="A short guide to getting started with the NetBeans Platform."/> |
| <!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. --> |
| <!-- Use is subject to license terms.--> |
| </head> |
| <body> |
| |
| <h1>Início rápido da Plataforma NetBeans</h1> |
| |
| <p>Bem-vindo à <a href="https://platform.netbeans.org/"><b>Plataforma NetBeans</b></a>!</p> |
| |
| <p>O principal benefício da plataforma NetBeans é a sua arquitetura modular. O segunda benefício é a dependência da plataforma NetBeans do kit de ferramentas Swing UI, que é o kit de ferramentas oficial para criar interfaces do usuário no Java, em combinação com o premiado construtor de GUI "Matisse".</p> |
| |
| <p>Nesta introdução, você é apresentado aos benefícios e ao uso da modularidade através de um exemplo bem simples, contribuído por Thomas Würthinger, que no momento é aluno PhD na Universidade Johannes Kepler em Linz, Áustria. Após ter compreendido os conceitos apresentados nesta introdução, você estará pronto para entrar na <a href="https://netbeans.org/kb/trails/platform_pt_BR.html">Trilha de aprendizado da plataforma NetBeans</a>, que fornece uma rica variedade de tutoriais para muitos diferentes cenários relativos à plataforma NetBeans.</p> |
| |
| <p class="tips"> Se for novo na plataforma NetBeans, recomenda-se com ênfase que você assista à série de screencasts <a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">As 10 principais APIs do NetBeans</a>.</p> |
| |
| <p><b>Conteúdo</b></p> |
| <p><img src="../images/articles/69/netbeans-stamp7-8-9.png" class="stamp" width="114" height="114" alt="O conteúdo desta página se aplica ao NetBeans IDE 6.5, 6.7, 6.8" title="O conteúdo desta página se aplica ao NetBeans IDE 6.5, 6.7, 6.8" /></p> |
| <ul class="toc"> |
| <li><a href="#single">Um módulo único do aplicativo da plataforma NetBeans</a></li> |
| <li><a href="#lookup">Um aplicativo modular que utiliza pesquisa</a></li> |
| <li><a href="#listener">LookupListener e InstanceContent</a></li> |
| </ul> |
| |
| <p><b>Para seguir este tutorial, os softwares e recursos listados na tabela seguinte são necessários.</b></p> |
| |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Software ou recurso</th> |
| <th class="tblheader" scope="col">Versão necessária</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td> |
| <td class="tbltd1">versão 6.7 ou superior</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td> |
| <td class="tbltd1">Versão 6 ou<br/>versão 5</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p><b class="notes">Nota:</b> embora seja um produto separado, não é necessário baixar a plataforma NetBeans separadamente. Normalmente, você desenvolverá o aplicativo no IDE e, em seguida, excluirá os módulos específicos do IDE, mas que são supérfluos para a seu aplicativo.</p> |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="single"></a>Um módulo único do aplicativo da plataforma NetBeans</h2> |
| |
| <p>Começamos criando um novo aplicativo da plataforma NetBeans, contendo um único módulo.</p> |
| |
| <ol> |
| |
| <li>Escolha Arquivo | Novo projeto e, em seguida, Módulos do NetBeans. Selecione "Aplicativo da plataforma NetBeans". O seguinte deverá ser exibido: |
| <p><img src="../images/tutorials/quickstart-platform/wordapp01.png" alt="Fig 1" /></p> |
| <p>Clique em Próximo.</p></li> |
| |
| <li>Nomeie seu novo aplicativo como "WordApp" e o torne o projeto principal do IDE: |
| <p><img src="../images/tutorials/quickstart-platform/wordapp02.png" alt="Fig 2" /></p> |
| <p class="tips"> O projeto principal do IDE é iniciado quando o comando "Executar projeto" do projeto global é chamado.</p> |
| <p>Clique em Terminar.</p></li> |
| |
| <li>Expanda o novo aplicativo na janela Projetos, clique com o botão direito do mouse no nó Módulos e escolha "Adicionar novo". Nomeie o novo módulo como "WordEngine": |
| <p><img alt="criar novo módulo" src="../images/tutorials/quickstart-platform/wordapp03.png" /></p> |
| <p>Clique em Próximo.</p></li> |
| |
| <li>Especifique um nome único para o módulo, que é o nome do código-base, assim como um nome que será exibido na janela Projetos: |
| <p><img alt="especifique um nome" src="../images/tutorials/quickstart-platform/wordapp04.png" /></p> |
| <p>Clique em Terminar. O novo módulo é criado e sua estrutura é mostrada na janela Projetos.</p></li> |
| |
| <li>Clique com o botão direito no módulo "WordEngine" e escolha Novo | Outro. Na categoria Desenvolvimento de módulo selecione "Componente da janela": |
| <p><img alt="criar nova janela" src="../images/tutorials/quickstart-platform/wordapp05.png" /></p> |
| |
| <p>Clique em Próximo. O seguinte deverá ser exibido:</p> |
| <p><img alt="criar nova janela" src="../images/tutorials/quickstart-platform/wordapp06.png" /></p> |
| <p>Clique em Próximo.</p></li> |
| |
| <li>Defina o prefixo do nome da classe como "Texto" e o pacote como "org.demo.wordengine": |
| <p><img alt="definir definições" src="../images/tutorials/quickstart-platform/wordapp07.png" /></p> |
| <p>Clique em Terminar. A nova janela é adicionada na estrutura do código-fonte de seu módulo junto com alguns arquivos XML subjacentes.</p></li> |
| |
| <li>Agora, clique duas vezes no arquivo "TextTopComponent.java" para abrir a visualização Projetar do construtor de GUI "Matisse". Use a Paleta (Ctrl-Shift-8) para arrastar e soltar um botão e uma área de texto na janela: |
| |
| <p><img alt="paleta" src="../images/tutorials/quickstart-platform/wordapp15.png" /></p> |
| |
| <p>Clique com o botão direito do mouse na área de texto, escolha "Alterar nome da variável" e, a seguir, a nomeie como "texto". Esse é o nome que permitirá o acesso ao componente de seu código. Selecione o texto do botão para "Filtrar".</p></li> |
| |
| <li>Clique duas vezes no botão, fazendo com que um método de manipulação de eventos seja automaticamente criado no editor de código-fonte. Esse método é chamado sempre que se clica no botão. Substitua o corpo do método pelo seguinte código. |
| <pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
|
| String s = text.getText();
|
| s = s.toUpperCase();
|
| text.setText(s);
|
| }</pre></li> |
| |
| <li>Clique com o botão direito do mouse no aplicativo e escolha Executar. Fazendo isso, seu novo aplicativo da plataforma NetBeans será iniciado e o módulo será instalado. Seu novo aplicativo deveria se parecer com o seguinte: |
| <p><img alt="mostrar novo aplicativo" src="../images/tutorials/quickstart-platform/wordapp08.png" /></p></li> |
| |
| <li>Escolha Janela | Texto, insira um texto na área de texto e clique em "Filtrar!". Você deverá ver que o texto agora é mostrado em maiúsculas. |
| <p><img alt="maiúscula" src="../images/tutorials/quickstart-platform/wordapp09.png" /></p></li> |
| |
| </ol> |
| |
| <p>Você aprendeu como criar um novo aplicativo da plataforma NetBeans e como adicionar novos módulos no mesmo.</p> |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="lookup"></a>Um aplicativo modular utilizando a pesquisa</h2> |
| |
| <p>Criamos dois módulos adicionais. O primeiro novo módulo define um serviço, que o segundo módulo fornece para o módulo que definimos na seção anterior.</p> |
| |
| <ol> |
| <li>Expanda o novo aplicativo na janela Projetos, clique com o botão direito do mouse no nó Módulos e escolha "Adicionar novo". Nomeie o novo módulo como "TextFilter", com o nome de código-base "org.demo.textfilter", complete o assistente, que adiciona o módulo no aplicativo anteriormente criado, como fez na seção anterior.</li> |
| |
| <li>Clique com o botão direito do mouse no módulo "TextFilter" e escolha Novo | Interface do Java. Nomeie a interface do Java como "TextFilter", no pacote "org.demo.textfilter", e utilize o editor para o definí-la da seguinte forma: |
| |
| <pre class="examplecode">package org.demo.textfilter;
|
|
|
| public interface TextFilter {
|
|
|
| String process(String s);
|
|
|
| } |
| </pre></li> |
| |
| <li>Clique com o botão direito do mouse no módulo "TextFilter", escolha Propriedades e utilize a aba "Versão de API" para especificar que o pacote contendo a interface deveria estar disponível através do aplicativo: |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp10.png"/></p></li> |
| |
| <li>Crie um terceiro módulo em seu aplicativo, o nomeie como "MyFilter", com "org.demo.myfilter" como o nome do código-base.</li> |
| |
| <li>Adicione uma dependência na caixa de diálogo propriedades do projeto do módulo "MyFilter" recém-criado para o módulo "TextFilter": |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp11.png"/></p></li> |
| |
| <li>Por causa da dependência acima definida, agora é possível implementar a interface definida no segundo módulo: |
| |
| <pre class="examplecode">package org.demo.myfilter; |
| |
| import org.demo.textfilter.TextFilter; |
| |
| @ServiceProvider(service=TextFilter.class) |
| public class UpperCaseFilter implements TextFilter { |
| |
| public String process(String s) { |
| return s.toUpperCase(); |
| } |
| |
| }</pre> |
| <p class="tips"> No momento da compilação, a anotação @ServiceProvider criará uma pasta META-INF/services com um arquivo que registra a sua implementação da interface TextFilter, seguido do mecanismo ServiceLoader do JDK 6. É necessário definir uma dependência no módulo API de utilitários, que proporciona a anotação ServiceProvider.</p></li> |
| |
| <li>O código que manuseia um clique no botão Filtrar agora precisa ser modificado, para que um implementador da interface "TextFilter" seja localizado e carregado. Quando tal implementador é encontrado, ele é chamado para filtrar o texto. |
| <p>Antes de poder fazer isso, precisamos adicionar uma dependência na caixa de diálogo Propriedades do projeto do módulo "WordEngine" para o módulo "TextFilter":</p> |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp12.png"/></p> |
| |
| <p>Agora, é possível carregar as implementações da classe "TextFilter", conforme ilustrado abaixo:</p> |
| |
| <pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { |
| String s = text.getText(); |
| <b>TextFilter filter = Lookup.getDefault().lookup(TextFilter.class)</b>;
|
| if (filter != null) {
|
| s = filter.process(s);
|
| }
|
| text.setText(s);
|
| }</pre> |
| |
| <p class="tips"> O acima deveria ser feito através da classe "ServiceLoader" do JDK 6, com exceção que a classe "Lookup" pode ser utilizada em JDK's anteriores ao JDK 6. Além disso, a classe "Lookup" tem um número de recursos adicionais, como será ilustrado na próxima seção.</p> |
| </li> |
| </ol> |
| |
| <p>Agora você está pronto para executar o código e verificar que tudo funciona como antes. Apesar da funcionalidade ser a mesma, o novo projeto modular oferece uma separação clara entre a interface gráfica do usuário e a implementação do filtro. O novo aplicativo também pode ser estendido com facilidade, basta adicionar novos provedores de serviços no classpath do aplicativo.</p> |
| |
| <p>Como um exercício, o código é alterado para que todos os filtros de texto ALL encontrados (use o método "lookupAll") sejam aplicados consecutivamente no texto. Por exemplo, adicione uma implementação de filtro de texto que remove todos os espaços em branco e, em seguida, teste o aplicativo resultante.</p> |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="listener"></a>LookupListener e InstanceContent</h2> |
| |
| <p>Criamos um quarto módulo que recupera de forma dinâmica o texto sempre que clicamos no botão "Filtrar!" botão no nosso primeiro módulo.</p> |
| |
| <ol> |
| <li>No primeiro módulo, altere o construtor do "TextTopComponent" como segue: |
| |
| <pre class="examplecode"><b>private InstanceContent content;</b> |
| |
| private TextTopComponent() { |
| initComponents(); |
| setName(NbBundle.getMessage(TextTopComponent.class, "CTL_TextTopComponent")); |
| setToolTipText(NbBundle.getMessage(TextTopComponent.class, "HINT_TextTopComponent")); |
| // setIcon(Utilities.loadImage(ICON_PATH, true)); |
| |
| <b>content = new InstanceContent(); |
| associateLookup(new AbstractLookup(content));</b> |
| |
| }</pre></li> |
| |
| <li>Altere o código do botão filtro para que o valor antigo seja adicionado ao objeto <tt>InstanceContent</tt> ao clicar no botão. |
| |
| <pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { |
| String s = text.getText(); |
| TextFilter filter = Lookup.getDefault().lookup(TextFilter.class); |
| if (filter != null) { |
| <b>content.add(s);</b> |
| s = filter.process(s); |
| } |
| text.setText(s); |
| }</pre></li> |
| |
| <li>Crie um novo módulo denominado "History" com o nome de código-base de "com.demo.history".</li> |
| <li>No módulo History, crie um novo componente da janela com o prefixo "History", no pacote "com.demo.history". Especifique que ele deveria aparecer na posição "editor". Após ter criado a janela, adicione uma área de texto nela. Altere o nome da variável da área de texto para "historyText".</li> |
| |
| <li>Adicione o código ao construtor da classe HistoryTopComponent para que ouça a pesquisa da classe <tt>String</tt> da janela no momento ativa. Ele exibe todos os objetos <tt>String</tt> recuperados na área de texto: |
| |
| <pre class="examplecode"><b>private Lookup.Result result;</b> |
| |
| private HistoryTopComponent() { |
| |
| ... |
| |
| <b>result = org.openide.util.Utilities.actionsGlobalContext().lookupResult(String.class); |
| result.addLookupListener(new LookupListener() { |
| public void resultChanged(LookupEvent e) { |
| historyText.setText(result.allInstances().toString()); |
| } |
| });</b> |
| }</pre></li> |
| |
| <li>É possível então iniciar o aplicativo e experimentá-lo. O resultado deveria parecer similar ao mostrado na captura de tela abaixo: |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp13.png"/></p> |
| |
| <p>Como um exercício, é possível alterar o tipo de resultado da pesquisa de <tt>String</tt> para <tt>Object</tt> e ver o que acontece ao selecionar diferentes janelas.</p></li> |
| |
| </ol> |
| |
| <p>Parabéns! Neste estágio, com uma pequena codificação, um pequeno exemplo de um aplicativo modular foi criado:</p> |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp14.png"/></p> |
| |
| <p>O aplicativo consiste em 4 módulos. O código de um módulo pode ser utilizado por outro módulo se (1) o primeiro módulo explicitamente expõe pacotes e (2) o segundo módulo define a dependência sobre o primeiro módulo. Desta forma, a plataforma NetBeans ajuda a organizar o código em uma arquitetura modular estrita, assegurando que o código não seja reutilizado de forma aleatória, mas somente quando há contratos definidos entre os módulos que fornecem o código.</p> |
| |
| <p>Em segundo lugar, a classe <tt>Lookup</tt> foi introduzida como um mecanismo para a comunicação entre os módulos, como uma extensão da abordagem JDK 6 ServiceLoader. As implementações são carregadas através de suas interfaces. Sem utilizar qualquer código de uma implementação, o módulo "WordEngine" é capaz de exibir o serviço fornecido pelo implementador. O acoplamento fraco é fornecido desta forma para a plataforma NetBeans.</p> |
| |
| <p class="tips"> Para saber mais sobre a modularidade e sobre a plataforma NetBeans, vá para a 4ª parte das séries "Gerenciamento de seleção da plataforma NetBeans", <a href="https://platform.netbeans.org/tutorials/nbm-selection-1.html">que começa aqui</a>. Após isso, inicie com a <a href="https://netbeans.org/kb/trails/platform_pt_BR.html">Trilha de aprendizado da plataforma NetBeans</a>, escolhendo os tutoriais que sejam mais relevantes para seu cenário administrativo particular. Além disso, sempre que tiver perguntas sobre a plataforma NetBeans, de qualquer tipo, sinta-se a vontade para escrever para a lista de correio dev@platform.netbeans.org; seu arquivo relacionado <a href="https://netbeans.org/projects/platform/lists/dev/archive">está aqui</a>.</p> |
| |
| <p>Divirta-se com a plataforma NetBeans e nos veremos na lista de correio!</p> |
| |
| |
| |
| </body> |
| |
| </html> |