| <!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 http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <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 name="description" |
| content="A short guide to getting started with the NetBeans Platform."> |
| </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>A principal vantagem da plataforma NetBeans é sua arquitetura modular. A segunda vantagem é 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>Nesta introdução, você é apresentado às vantagens e ao uso da modularidade através de um exemplo bem simples, contribuído por Thomas Würthinger, que no momento é um 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 class="tips"> Caso seja 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><b>Conteúdo</b></p> |
| <img src="../images/articles/68/netbeans-stamp-65-67-68.gif" 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 usando a pesquisa</a> |
| <li><a href="#listener">LookupListener e InstanceContent</a></li> |
| </ul> |
| |
| <p><b>Para seguir este tutorial, você preciso dos softwares e recursos listados na tabela seguinte.</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.5 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">Observação:</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. |
| |
| <!-- ===================================================================================== --> |
| |
| <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. |
| |
| <ol> |
| |
| <p><li>Escolha Arquivo | Novo projeto e, a seguir, escolha Módulos do NetBeans. Selecione "Aplicativo da plataforma NetBeans". O seguinte deverá ser exibido:</p> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp01.png" alt="Fig 1"> |
| <p>Clique em Próximo.</p> |
| |
| <p><li>Nomeie seu novo aplicativo como "WordApp" e torne-o o projeto principal do IDE:</p> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp02.png" alt="Fig 2"> |
| <p class="tips"> O projeto principal do IDE é iniciado quando o comando "Executar projeto" do projeto global é chamado.</p> |
| <p>Clique em Terminar.</p> |
| |
| <p><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> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp03.png"/> |
| <p>Clique em Próximo.</p> |
| |
| <p><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> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp04.png"/> |
| <p>Clique em Terminar. O novo módulo é criado e sua estrutura é mostrada na janela Projetos. |
| |
| <p><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 border="1" src="../images/tutorials/quickstart-platform/wordapp05.png"/> |
| |
| <p><p>Clique em Próximo. O seguinte deverá ser exibido:</p> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp06.png"/> |
| <p>Clique em Próximo.</p> |
| |
| <p><li>Defina o prefixo do nome da classe como "Texto" e o pacote como "org.demo.wordengine":</p> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp07.png"/> |
| <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> |
| |
| <p><li>Agora, clique 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> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp15.png"/> |
| |
| <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". Este é o nome que permitirá o acesso ao componente de seu código. Selecione o texto do botão para "Filtrar". |
| |
| <p><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. Este método é chamado sempre que se clica no botão. Substitua o corpo do método pelo seguinte código.</p> |
| <p><pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
|
| String s = text.getText();
|
| s = s.toUpperCase();
|
| text.setText(s);
|
| }</pre> |
| |
| <p><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> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp08.png"/> |
| |
| <p><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> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp09.png"/> |
| |
| </ol> |
| |
| <p>Você aprendeu como criar um novo aplicativo da plataforma NetBeans e como adicionar novos módulos no mesmo. |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="lookup"></a>Um aplicativo modular usando 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. |
| |
| <ol> |
| <p><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.</p> |
| |
| <p><li>Clique com o botão direito no módulo "TextFilter" e escolha Novo | Interface do Java. Nomeie a interface do Java como "TextFilter", no pacote "org.demo.textfilter", e use o editor para o defini-la da seguinte forma: |
| |
| <p><pre class="examplecode">package org.demo.textfilter;
|
|
|
| public interface TextFilter {
|
|
|
| String process(String s);
|
|
|
| } |
| </pre> |
| |
| <p><li>Clique com o botão direito do mouse no módulo "TextFilter", escolha Propriedades e use a aba "Versão de API" para especificar que o pacote contendo a interface deveria estar disponível através do aplicativo:</p> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/fig-10.png"/> |
| |
| <p><li>Crie um terceiro módulo em seu aplicativo, nomeie o mesmo como "MyFilter", com "org.demo.myfilter" como o nome do código-base.</p> |
| |
| <p><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> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/fig-11.png"/> |
| |
| <p><li>Por causa da dependência acima definida, você agora pode implementar a interface definida no segundo módulo: |
| |
| <p><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>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>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> |
| <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>Agora, você pode carregar as implementações da classe "TextFilter", conforme ilustrado abaixo:</p> |
| |
| <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 usada 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> |
| |
| </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, bastando adicionar novos provedores de serviços no classpath do aplicativo.</p> |
| |
| <p>Como um exercício, você altera o código, 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 a seguir 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!" em nosso primeiro módulo. |
| |
| <ol> |
| <p><li>No primeiro módulo, altere o construtor do "TextTopComponent" como segue:</p> |
| |
| <p><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> |
| |
| <p><li>Altere o código do botão filtro para que o valor antigo seja adicionado ao objeto <tt>InstanceContent</tt> quando o botão é clicado.</p> |
| |
| <p><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> |
| |
| <p><li>Crie um novo módulo denominado "History" com o nome de código-base de "com.demo.history". |
| <p><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 um área de texto na mesma. Altere o nome da variável da área de texto para "historyText".</p> |
| |
| <p><li>Adicione 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:</p> |
| |
| <p><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> |
| |
| <p><li>Você pode então iniciar o aplicativo e experimentá-lo. O resultado deveria parecer similar ao mostrado na captura de tela abaixo:</p> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp13.png"/> |
| |
| <p>Como um exercício, você pode alterar o tipo de resultado da pesquisa de <tt>String</tt> para <tt>Object</tt> e ver o que acontece quando seleciona diferentes janelas.</p> |
| |
| </ol> |
| |
| <p>Parabéns! Neste estágio, como apenas alguma codificação, você criou um pequeno exemplo de um aplicativo modular: |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp14.png"/> |
| |
| <p>O aplicativo consiste em 4 módulos. O código de um módulo pode ser usado 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 seu 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 usar qualquer código de um 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. Também, sempre que tiver perguntas sobre a plataforma NetBeans, de qualquer tipo, sinta-se a vontade para escrever para a lista de correio, dev@openide.netbeans.org, seu arquivo relacionado <a href="https://netbeans.org/projects/openide/lists/dev/archive">está aqui</a>.</p> |
| |
| <p>Divirta-se com a plataforma NetBeans e nos veremos na lista de correio!</p> |
| |
| |
| |
| </body> |
| |
| </html> |