| <!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>Criando o aplicativo CRUD da plataforma NetBeans utilizando Maven</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="indexed" content="y"/> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta name="description" |
| content="This tutorial demonstrates how to use the the Maven build framework to create a simple |
| NetBeans Platform application that can read and write to a database."/> |
| <!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. --> |
| <!-- Use is subject to license terms.--> |
| </head> |
| <body> |
| |
| <h1>Criando o aplicativo CRUD da plataforma NetBeans utilizando Maven</h1> |
| |
| <p>Bem-vindo à <a href="https://platform.netbeans.org/"><b>Plataforma NetBeans</b></a>!</p> |
| |
| <p>Este documento mostra como utilizar a estrutura de construção Maven para criar um aplicativo da plataforma NetBeans que possa ser lido e gravado num banco de dados. Neste documento poderão ser utilizados os arquétipos Maven para criar o aplicativo e o módulo da plataforma NetBeans e o kit de ferramentas da Interface do usuário Swing e o construtor de GUI "Matisse" para criar componentes da janela. |
| </p> |
| |
| <p>Este documento se baseia no <a href="nbm-crud_pt_BR.html">Tutorial do aplicativo NetBeans CRUD com base Ant para a plataforma NetBeans</a> e ilustra algumas das diferenças entre o uso de Ant e Maven para desenvolver os aplicativos da plataforma NetBeans. Após entender como Maven se diferencia de Ant, é possível prosseguir facilmente através de outros tutoriais na <a href="https://netbeans.org/kb/trails/platform_pt_BR.html">Trilha de aprendizagem da plataforma NetBeans</a>. |
| </p> |
| |
| <p class="tips">O aplicativo modelo CRUD é um dos modelos Maven disponíveis no assistente do Novo projeto.</p> |
| |
| <p class="tips">Caso não tenha experiência com a plataforma NetBeans, recomenda-se assistir à série de screencasts <a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">As 10 principais APIs NetBeans</a>.</p> |
| |
| <p><b>Conteúdo</b></p> |
| <p><img src="../../images/articles/69/netbeans-stamp69.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="#config">Configurando o Maven</a></li> |
| <li><a href="#01">Criando o projeto do aplicativo da plataforma NetBeans</a> |
| <ul> |
| <li><a href="#01b">Criando um módulo</a></li> |
| <li><a href="#01c">Tornando o módulo uma dependência</a></li> |
| <li><a href="#01d">Identificando a marca do aplicativo</a></li> |
| </ul> |
| </li> |
| <li><a href="#02">Criando as classes de entidade</a> |
| <ul> |
| <li><a href="#02a">Adicionando o FerbyClient como uma dependência de tempo de execução</a></li> |
| <li><a href="#02b">Gerando classe de entidade a partir do banco de dados</a></li> |
| </ul> |
| </li> |
| <li><a href="#03">LER: Lendo e exibindo um registro</a> |
| <ul> |
| <li><a href="#03b">Adicionando uma visualização de árvore à janela</a></li> |
| <li><a href="#03c">Criando uma classe de fábrica</a></li> |
| <li><a href="#03d">Modificando dependências</a></li> |
| </ul> |
| </li> |
| <li><a href="#04">ATUALIZAÇÃO: Editando um registro</a> |
| <ul> |
| <li><a href="#04b">Utilizando um LookupListener</a></li> |
| <li><a href="#04c">Adicionando as funções Desfazer e Refazer</a></li> |
| <li><a href="#04d">Adicionando a função Salvar</a></li> |
| <li><a href="#04e">Alterações persistentes</a></li> |
| <li><a href="#04f">Adicionando a função Atualizar</a></li> |
| </ul> |
| </li> |
| <li><a href="#05">CRIAR: adicionando um novo registro</a> |
| <ul> |
| <li><a href="#05b">Criando e salvando um novo objeto</a></li> |
| </ul> |
| </li> |
| <li><a href="#06">Executando o aplicativo</a></li> |
| </ul> |
| |
| <p><b>Para seguir este tutorial, são necessários o software e os recursos listados na tabela a seguir.</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="http://download.netbeans.org/netbeans/6.9/beta/">NetBeans IDE</a></td> |
| <td class="tbltd1">versão 6.9 (Java)</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</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://maven.apache.org/">Maven</a></td> |
| <td class="tbltd1">Versão 2.0.9 ou uma mais recente</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">JavaDB ou outro servidor do banco de dados e banco de dados</td> |
| <td class="tbltd1"> </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p><strong class="notes">Nota:</strong></p> |
| <ul> |
| <li>O servidor do banco de dados JavaDB e um banco de dados modelo estão incluídos no pacote do GlassFish Server Open Source Edition 3.0.1.</li> |
| <li>Não é necessário fazer o download de uma versão avulsa da plataforma NetBeans para desenvolver os aplicativos para a plataforma NetBeans. Normalmente, se desenvolve os aplicativos e módulos no NetBeans IDE e, a seguir, inclui-se somente os módulos necessários para executar a plataforma NetBeans e seu aplicativo.</li> |
| </ul> |
| <p>Antes de começar este tutorial, talvez você queira se familiarizar com a documentação a seguir.</p> |
| <ul> |
| <li><a href="http://wiki.netbeans.org/MavenBestPractices">Melhores práticas para o Apache Maven no NetBeans 6.x</a></li> |
| <li><a href="http://www.sonatype.com/books/maven-book/reference/introduction.html">Capítulo 1. Introdução ao Apache Maven</a> (do <a href="http://www.sonatype.com/books/maven-book/reference/public-book.html">Maven: o guia definitivo</a>)</li> |
| <li><a href="https://netbeans.org/kb/docs/java/gui-functionality_pt_BR.html">Introdução à construção de GUI</a></li> |
| </ul> |
| |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++ Configuring Maven +++++++++++++++++++++++++++++++++ --> |
| |
| <h2><a name="config"></a>Configurando o Maven</h2> |
| <p>Se este for seu primeiro projeto Maven, talvez você queira verificar as definições de configurações do Maven na janela Opções. Para completar este tutorial é preciso ter o Maven instalado em seu sistema local. É possível fazer o download do instalador a partir do <a href="http://maven.apache.org/">site do Maven</a>.</p> |
| |
| <ol> |
| <li>Selecione a categoria Diversos na janela Opções e clique na aba Maven.</li> |
| <li>Especifique a localização da instalação local do Maven (exige-se o 2.0.9 ou um mais recente).</li> |
| <li>Verifique se a localização do repositório local do Maven está correta.</li> |
| <li>Clique em OK.</li> |
| </ol> |
| <p>Na maioria dos casos, se a configuração do Maven for típica a informação na janela Opções já deve estar correta.</p> |
| |
| <p>O IDE usa o Maven SCM para a verificação de artefatos Maven. Talvez você queira verificar se todos os clientes necessários para a verificação de fontes estão instalados no seu computador e configurados corretamente.</p> |
| <p class="tips">Para obter mais detalhes sobre o Maven SCM, consulte a <a href="http://maven.apache.org/scm/index.html">página Maven SCM</a>.</p> |
| |
| <div class="indent"> |
| <h3><a name="config1"></a>Visualizando os repositórios Maven</h3> |
| <p>Os artefatos que são utilizados pelo Maven para construir todos os seus projetos são armazenados em seu repositório local Maven. Quando um artefato é declarado como uma dependência do projeto, o artefato é baixado para seu repositório local a partir de um dos repositórios remotos registrados.</p> |
| |
| <p>O repositório NetBeans e vários super conhecidos repositórios indexados Maven são, por padrão, registrados e listados na janela do Navegador do repositório. O repositório NetBeans contém a maioria dos artefatos públicos necessários para a construção do seu projeto. É possível utilizar o navegador do repositório Maven para visualizar o conteúdo dos repositórios locais e remotos. É possível expandir o nó Repositório local para ver os artefatos que estão presentes localmente. Os artefatos listados sob os nós repositório NetBeans podem ser adicionados como dependências de projeto, mas nem todos eles estão presentes no local. Eles são adicionados ao repositório local somente quando são declarados como dependências do projeto.</p> |
| |
| <p>Para abrir o navegador do repositório Maven:</p> |
| <ul> |
| <li>Selecione Janela > Outro > Navegador do repositório Maven no menu principal.<br/> |
| <img src="../../images/tutorials/maven-quickstart68/maven-nbm-netbeans-repo.png" alt="Captura de tela do navegador do repositório Maven" title="Captura de tela do navegador do repositório Maven" class="margin-around b-all" /> |
| </li> |
| </ul> |
| |
| |
| <p>Quando seu cursor estiver sobre um artefato, o IDE exibirá uma dica de ferramenta com as coordenadas do artefato. É possível visualizar detalhes adicionais sobre um artefato ao clicar duas vezes no arquivo JAR do artefato no navegador.</p> |
| |
| <p class="tips">É possível pesquisar por um artefato ao clicar no botão Localizar da barra de ferramentas do navegador do repositório Maven ou ao utilizar o campo de texto Pesquisa rápida na barra de ferramentas principal.</p> |
| <p class="tips">Para saber mais sobre como gerenciar as dependências do classpath Maven e sobre como trabalhar com repositórios Maven no IDE, consulte a seção <a href="http://wiki.netbeans.org/MavenBestPractices#Dependency_management">Gerenciamento de dependência</a> em <a href="http://wiki.netbeans.org/MavenBestPractices">Melhores práticas para o Apache Maven no NetBeans 6.x</a>. |
| </p> |
| <p class="tips">Para assistir a uma demonstração sobre como utilizar o Visualizador de artefato, consulte o screencast <a href="https://netbeans.org/kb/docs/java/maven-dependencies-screencast.html"> Trabalhando com dependências Maven</a>.</p> |
| |
| </div> |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++ Creating the Platform Application +++++++++++++++++ --> |
| |
| <h2><a name="01"></a>Criando o projeto do aplicativo da plataforma NetBeans</h2> |
| |
| <p>Nesta seção será utilizado o assistente Novo projeto para criar um aplicativo da plataforma NetBeans a partir de um arquétipo Maven. O assistente criará os projetos do módulo Maven que serão necessários para desenvolver um aplicativo da plataforma NetBeans. Será utilizado também o assistente Novo projeto para criar o módulo NetBeans. |
| </p> |
| |
| <div class="indent"> |
| <h3><a name="01a"></a>Criando o projeto |
| </h3> |
| |
| <p>Siga as seguintes etapas para criar o aplicativo da plataforma NetBeans utilizando o assistente do Novo projeto. |
| </p> |
| <ol> |
| <li>Selecione Arquivo > Novo projeto (Ctrl-Shift-N) para abrir o assistente do Novo projeto.</li> |
| <li>Selecione Aplicativo NetBeans Maven na categoria Maven. Clique em Próximo.</li> |
| <li>Digite <strong>MavenPlatformCRUDApp</strong> para o nome do projeto e defina a localização do projeto. Clique em Concluir.</li> |
| </ol> |
| |
| <p class="notes"><strong>Nota:</strong> é possível clicar em Próximo e criar um projeto do módulo no assistente ao criar o aplicativo da plataforma, mas para fins de demonstração neste tutorial, será criado o aplicativo e o módulo separadamente.</p> |
| |
| <img src="../../images/tutorials/maven-crud/mavencrud-new-project.png" alt="Captura de tela do assistente do Novo projeto" title="Captura de tela do assistente do Novo projeto" class="margin-around b-all" /> |
| |
| <p>Ao clicar em Concluir, por padrão, o IDE cria os seguintes tipos de projetos Maven.</p> |
| <ul> |
| <li><strong>Aplicativo da plataforma NetBeans.</strong> Este projeto é um projeto recipiente para o aplicativo da plataforma e lista os modelos a serem incluídos e a localização dos repositórios do projeto. Este projeto não contém nenhuma origem. O IDE gera os módulos contendo as origens e recursos nos subdiretórios deste projeto. </li> |
| <li><strong>Plataforma NetBeans com base no aplicativo.</strong> Este projeto especifica os artefatos (fontes) necessários para a compilação do aplicativo. As dependências exigidas (artefatos IDE, artefatos de módulos) são especificados no arquivo <tt>pom.xml</tt> do projeto.</li> |
| <li><strong>Recursos da marca do aplicativo da plataforma.</strong> Este projeto contém os recursos utilizados para identificação da marca do aplicativo. </li> |
| </ul> |
| <img src="../../images/tutorials/maven-crud/mavencrud-projects-window1.png" alt="Captura de tela da estrutura do projeto na janela Projetos" title="Estrutura do projeto na janela Projetos" class="margin-around b-all" /> |
| |
| <p class="notes"><strong>Notas.</strong></p> |
| <ul> |
| <li>Caso este seja seu primeiro aplicativo da plataforma NetBeans utilizando o Maven, pode ser que leve mais tempo para criar os projetos, pois o IDE precisa baixar todos os artefatos necessários a partir do repositório NetBeans.</li> |
| <li>Ao criar o projeto, será possível ver que alguns dos projetos (por exemplo, o projeto do aplicativo com base na Plataforma NetBeans) são evidenciados porque algumas das dependências declaradas no arquivo (POM)<tt>pom.xml</tt> não se encontram disponíveis.</li> |
| </ul> |
| |
| |
| |
| <h3><a name="01b"></a>Criando um módulo</h3> |
| <p>Neste exercício será utilizado o assistente do Novo projeto para criar o módulo NetBeans. |
| </p> |
| |
| <ol> |
| <li>Selecione Arquivo > Novo projeto (Ctrl-Shift-N) para abrir o assistente do Novo projeto.</li> |
| <li>Selecione Módulo NetBeans Maven na categoria Maven. Clique em Próximo.</li> |
| <li>Digite <strong>MavenPlatformCRUDApp-dbaccess</strong> para o Nome do projeto.</li> |
| <li>Especifique a localização do projeto clicando em Navegador e localizando o diretório <strong>MavenPlatformCRUDApp-dbaccess</strong>. Clique em Abrir.<br/> |
| <img src="../../images/tutorials/maven-crud/mavencrud-select-location.png" alt="Captura de tela da caixa de diálogo Selecionar localização mostrando a localização" title="caixa de diálogo Selecionar localização do projeto mostrando o diretório do projeto" class="margin-around b-all" /> |
| </li> |
| <li>Clique em Concluir. </li> |
| </ol> |
| |
| <p>Ao clicar em Concluir, o assistente cria um projeto de módulo NetBeans chamado <strong>MavenPlatformCRUDApp-dbaccess</strong>. O módulo será automaticamente configurado para ser incluído no aplicativo ao ser salvo num subdiretório. Caso abra o POM para o projeto, é possível notar que o MavenPlatformCRUDApp foi declarado como o projeto pai. |
| </p> |
| <pre class="examplecode"><parent> |
| <artifactId>MavenPlatformCRUDApp</artifactId> |
| <groupId>com.mycompany</groupId> |
| <version>1.0-SNAPSHOT</version> |
| </parent> |
| <artifactId>MavenPlatformCRUDApp-dbaccess</artifactId> |
| <packaging>nbm</packaging> |
| <version>1.0-SNAPSHOT</version> |
| <name>MavenPlatformCRUDApp - dbaccess NetBeans Module</name> |
| </pre> |
| |
| <p class="tips">É possível alterar a exibição do nome para o módulo editando o elemento <tt><nome></tt> no POM ou modificando o nome na janela Propriedades do projeto. O nome de exibição padrão é a Id do artefato do projeto <tt>MavenPlatformCRUDApp-dbaccess</tt>.</p> |
| |
| <p>Se observar o POM para o aplicativo da plataforma NetBeans sob o nó Arquivos do projeto na janela Projetos, é possível notar que três módulos estão listados como módulos no aplicativo.</p> |
| <pre class="examplecode"> |
| <modules> |
| <module>branding</module> |
| <module>application</module> |
| <module>MavenPlatformCRUDApp-dbaccess</module> |
| </modules> |
| </pre> |
| |
| |
| <h3><a name="01c"></a>Tornando o módulo uma dependência</h3> |
| <p>Agora será necessário adicionar o módulo como uma dependência do aplicativo com base na plataforma NetBeans. É possível adicionar a dependência editando <tt>pom.xml</tt> no editor ou utilizando a caixa de diálogo Adicionar dependência.</p> |
| <ol> |
| <li>Amplie o nó <strong>Aplicativo com base na plataforma NetBeans</strong> na janela Projetos.</li> |
| <li>Clique com o botão direito do mouse no nó Bibliotecas e selecione Adicionar dependência.</li> |
| <li>Clique na aba Abrir projetos e selecione <strong>MavenPlatformCRUDApp - dbaccess</strong>. Clique em OK.<br/> |
| <img src="../../images/tutorials/maven-crud/mavencrud-add-dependency1.png" alt="Captura de tela da caixa de diálogo Adicionar dependência" title="aba Abrir projetos na caixa de diálogo Adicionar dependência" class="margin-around b-all" /> |
| </li> |
| </ol> |
| |
| |
| <p>Caso amplie o nó Bibliotecas do aplicativo com base na plataforma NetBeans na janela Projetos, é possível notar que o MavenPlatformCRUDApp-dbaccess está agora listado como uma dependência.</p> |
| |
| <p>Se observar o POM do aplicativo com base na plataforma NetBeans, verá que o artefato <tt>MavenPlatformCRUDApp-dbaccess</tt> está listado como uma dependência necessária para a compilação do aplicativo. O artefato estará disponível após a construção do projeto do módulo e a instalação do artefato no seu repositório local.</p> |
| |
| <pre class="examplecode"><dependency> |
| <groupId>${project.groupId}</groupId> |
| <artifactId><strong>MavenPlatformCRUDApp-dbaccess</strong></artifactId> |
| <version>${project.version}</version> |
| </dependency></pre> |
| |
| |
| |
| <h3><a name="01d"></a> Marcando o aplicativo</h3> |
| <p>O módulo da marca especifica os recursos da marca que são utilizados ao construir o aplicativo da plataforma. A caixa de diálogo da marca lhe permite especificar facilmente o nome do aplicativo, a tela de splash e o ícone do aplicativo e modificar os valores dos elementos do texto.</p> |
| |
| <p>Neste exercício será substituída a imagem de splash padrão. Por padrão, o módulo da marca gerado pelo IDE contém uma imagem que é exibida ao iniciar o aplicativo da plataforma. É possível substituí-la por uma imagem diferente executando os passos a seguir.</p> |
| <ol> |
| <li>Clique com o botão direito no módulo <strong>Recursos da marca do aplicativo da plataforma</strong> na janela Projetos e selecione Marca.</li> |
| <li>Na aba Tela de splash, especifique uma imagem para utilizar como a tela de splash clicando no botão Navegador ao lado da imagem da tela de splash e localizando a imagem que deseja utilizar. Clique em OK.</li> |
| </ol> |
| |
| <p>Por exemplo, é possível copiar a imagem abaixo no sistema local e especificar a imagem na caixa de diálogo Marca.</p> |
| <img src="../../images/tutorials/maven-crud/splash-crud.gif" alt="Exemplo de imagem de splash padrão" title="Exemplo de imagem de splash padrão" class="margin-around b-all" /> |
| |
| <p>Ao iniciar o aplicativo, a nova imagem aparecerá durante a inicialização.</p> |
| </div> |
| |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++++++++++ Creating the Entity Classes +++++++++++++++++++ --> |
| |
| |
| <h2><a name="02"></a>Criando as classes de entidade</h2> |
| |
| <p>Nesta seção será possível gerar algumas entidades a partir das tabelas no banco de dados do Java DB. Para criar as classes de entidades e utilizar o Java Persistence API (JPA) no seu aplicativo, é necessário ter acesso ao servidor do banco de dados e às bibliotecas do provedor de persistência JPA. Este tutorial usa o servidor do banco de dados do JavaDB, mas é possível configurar o aplicativo para utilizar outros servidores de banco de dados.</p> |
| |
| <p>O jeito mais fácil de tornar os recursos disponíveis é registrar uma instância do GlassFish Server Open Source Edition 3.0.1 que vem com o IDE. O servidor do banco de dados do Java DB, um banco de dados modelo e um provedor de persistência JPA estão incluídos no servidor GlassFish. Antes de criar classes de entidades, inicie o Java DB executando os passos a seguir.</p> |
| |
| <ol> |
| <li>Na janela Serviços, amplie o nó Servidores e verifique se há uma instância GlassFish registrada.</li> |
| <li>Amplie o nó Banco de dados, clique com o botão direito no nó conexão do banco de dados para o <strong>banco de dados</strong> do aplicativo no Java DB (<tt>jdbc:derby://localhost:1527/sample [app on APP]</tt> e selecione Conectar. </li> |
| </ol> |
| |
| <p>Ao selecionar Conectar, o IDE iniciará o banco de dados, caso este já não tenha sido iniciado.</p> |
| <div class="indent"> |
| <h3><a name="02a"></a>Adicionando do DerbyClient como uma dependência do tempo de execução</h3> |
| |
| <p>Nesta seção será possível adicionar a biblioteca do derbyclient-10.5.3.0_1 como uma dependência.</p> |
| |
| <ol> |
| <li>Clique com o botão direito no nó Bibliotecas do módulo <strong>dbaccess</strong> e selecione Adicionar dependência.</li> |
| <li>Adicione a biblioteca digitando <strong>org.apache.derby</strong> para a Id do grupo, <strong>derbyclient</strong> para a Id do artefato e <strong>10.5.3.0_1</strong> para a Versão.</li> |
| <li>Selecione <strong>Tempo de execução</strong> na lista suspensa Escopo. Clique em OK.<br/> |
| <img src="../../images/tutorials/maven-crud/mavencrud-add-dependency-derby.png" alt="Exemplo da caixa de diálogo Adicionar dependência" title="Adição do JAR derbyclient na caixa de diálogo Adicionar dependência" class="margin-around b-all" /> |
| </li> |
| </ol> |
| |
| <p>Caso amplie o nó Bibliotecas do tempo de execução na janela Projetos, é possível notar que a biblioteca <tt>derbyclient</tt> está listada como uma dependência.</p> |
| <p class="tips">Também é possível modificar o POM no editor para especificar o valor do elemento <tt><escopo></tt> de uma dependência.</p> |
| |
| <pre class="examplecode"><dependência> |
| <Id do grupo>org.apache.derby</Id do grupo> |
| <Id do artefato>derbyclient</Id do artefato> |
| <versão>10.5.3.0_1</versão> |
| <escopo>tempo de execução</escopo> |
| </dependência></pre> |
| |
| <h3><a name="02b"></a>Gerando classes de entidade a partir do banco de dados</h3> |
| <p>Nesta seção será utilizado um assistente para gerar classes de entidade no módulo <strong>dbaccess</strong>. |
| </p> |
| |
| <ol> |
| <li>Clique com o botão direito em Pacotes originais do módulo <strong>dbaccess</strong> e selecione Novo > Outro.</li> |
| <li>Selecione Classes de entidade a partir do banco de dados na categoria Persistência. Clique em Próximo.</li> |
| <li>Selecione o banco de dados modelo Java DB na lista suspensa Conexão do banco de dados.</li> |
| <li>Selecione a tabela Cliente na lista Tabelas disponíveis, e clique em Adicionar. Ao clicar em Adicionar, a tabela relacionada Códigodedesconto também é adicionada à lista Tabelas selecionadas. Clique em Próximo.</li> |
| <li>Digite <strong>com.mycompany.mavenplatformcrudapp.dbaccess</strong> para o nome do pacote. Certifique-se de que os comandos Criar unidade de persistência e Gerar anotações de consultas nomeadas estejam selecionados. Clique em Concluir.</li> |
| </ol> |
| <p>Ao clicar em Concluir, o IDE gera as classes de entidade Cliente e Código de desconto. O IDE também gera o arquivo <tt>persistence.xml</tt>no pacote <tt>META-INF</tt> sob o nó Outras fontes, no diretório <tt>src/main/resources</tt>.</p> |
| |
| |
| |
| |
| |
| |
| |
| |
| </div> |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++++++ Implementing CRUD : READ ++++++++++++++++++++++ --> |
| |
| |
| <h2><a name="03"></a>LER: Leitura e Exibição de um registro</h2> |
| <p>Nesta seção será utilizado um assistente para adicionar um Componente de janela ao módulo <strong>dbaccess</strong>. Será ativada uma visualização de árvore no componente de janela exiba os objetos como nós. É possível visualizar os dados para cada registro na janela de propriedades dos nós.</p> |
| |
| <div class="indent"> |
| |
| <h3><a name="03a"></a>Adicionando um Componente de janela</h3> |
| <p>Neste exercício será criado o componente de janela.</p> |
| <ol> |
| <li>Clique com o botão direito do mouse no nó Projeto na janela Projetos e selecione Nova > Janela.</li> |
| <li>Selecione: <strong>editor</strong>na lista suspensa Posição da janela e selecione <strong>Abrir na inicialização do aplicativo</strong>. Clique em Próximo.<br/> |
| <img src="../../images/tutorials/maven-crud/mavencrud-new-window-customer.png" alt="Captura de tela do assistente Nova janela " title="página Configuração básica do assistente Nova janela" class="margin-around b-all" /> |
| </li> |
| <li>Digite: <strong>Cliente</strong> como o Prefixo do nome da classe.</li> |
| <li>Digite: <strong>com.mycompany.mavenplatformcrudapp.viewer</strong> para o pacote. Clique em Concluir. |
| <p>O assistente exibe uma lista de arquivos que serão criados e modificados. </p></li> |
| </ol> |
| <p>Ao clicar em Concluir, na janela Projetos, é possível notar que o IDE gera a classe <tt>CustomerTopComponent.java</tt> em <tt>com.mycompany.mavenplatformcrudapp.viewer</tt> sob Pacotes originais. É possível visualizar a estrutura do projeto na janela Arquivos. Para compilar um projeto Maven, somente podem ser localizados arquivos de origem sob o diretório Pacotes originais (<tt>src/main/java</tt> na janela Arquivos). Arquivos de recursos (ex. arquivos XML) devem estar localizados sob o diretório Outras fontes (<tt>src/main/resources</tt>na janela Arquivos).</p> |
| |
| |
| <h3><a name="03b"></a>Adicionando uma visualização de árvore</h3> |
| |
| <p>Agora será modificado o componente de janela a fim de exibir registros do banco de dados numa visualização de árvore. Será adicionado o gerenciador de entidade ao construtor e ativará uma visualização de árvore bean.</p> |
| <ol> |
| <li>Clique na aba Origem do <tt>CustomerTopComponent.java</tt> para visualizar o código da fonte no editor.</li> |
| <li>Modifique o construtor para adicionar os seguintes comandos. |
| <pre class="examplecode">EntityManager entityManager = Persistence.createEntityManagerFactory("com.mycompany_MavenPlatformCRUDApp-dbaccess_nbm_1.0-SNAPSHOTPU").createEntityManager(); |
| Query query = entityManager.createQuery("SELECT c FROM Customer c"); |
| List<Customer> resultList = query.getResultList();<strong>EntityManager entityManager = Persistence.createEntityManagerFactory("com.mycompany_MavenPlatformCRUDApp-dbaccess_nbm_1.0-SNAPSHOTPU").createEntityManager(); |
| Query query = entityManager.createQuery("SELECT c FROM Customer c"); |
| List<Customer> resultList = query.getResultList();</strong>}</pre> |
| |
| <p class="tips">Certifique-se de que o nome da unidade persistente no código esteja correto comparando-o ao nome especificado no <tt>persistence.xml</tt>.</p> |
| </li> |
| <li>Modifique a assinatura de classe para implementar o <tt>ExplorerManager.Provider.</tt> |
| <pre class="examplecode">public final class CustomerTopComponent extends TopComponent <strong>implements ExplorerManager.Provider</strong></pre> |
| </li> |
| <li>Corrija as importações para importar o <tt><strong>javax.persistence.Query</strong></tt> e o <tt><strong>javax.util.List</strong></tt>.</li> |
| <li>Declare e inicialize o ExplorerManager: |
| <pre class="examplecode">private static ExplorerManager em = new ExplorerManager();</pre> |
| </li> |
| <li>Implemente os métodos abstratos e modifique o método <tt>getExplorerManager</tt> para retornar <tt>em</tt>. |
| <pre class="examplecode">@Override
|
| public ExplorerManager getExplorerManager() {
|
| return em;
|
| }</pre> |
| <p class="tips">É possível colocar o cursor de inserção na assinatura de classe e pressionar Alt+Enter para implementar os métodos abstratos.</p> |
| </li> |
| <li>Adicione os comando seguintes ao construtor para ativar a visualização de árvore. |
| <pre class="examplecode">BeanTreeView beanTreeView = new BeanTreeView(); |
| adicionar(beanTreeView, BorderLayout.CENTER);</pre> |
| </li> |
| |
| <li>Na visualização Desenho, clique com o botão direito no componente e selecione Definir Layout > Layout da borda. Salve as alterações.</li> |
| |
| </ol> |
| |
| <h3><a name="03c"></a>Criação de uma Classe de fábrica</h3> |
| |
| <p>Agora será criado criar uma nova classe <strong>CustomerChildFactory</strong> no pacote <tt>com.mycompany.mavenplatformcrudapp.viewer</tt> que cria um novo BeanNode para cada cliente no seu banco de dados.</p> |
| <ol> |
| |
| <li>Clique com o botão direito no pacote <tt><strong>com.mycompany.mavenplatformcrudapp.viewer</strong></tt>e selecione Nova > Classe Java.</li> |
| <li>Digite <strong>CustomerChildFactory</strong> para o Nome da classe. Clique em Concluir.</li> |
| <li>Modifique a assinatura para estender <tt>ChildFactory<Cliente></tt>.</li> |
| <li>Declare o campo <tt>resultList</tt> para a lista de itens na tabela e adicione o método <tt>CustomerChildFactory</tt>. |
| <pre class="examplecode">private List<Customer> resultList; |
| |
| public CustomerChildFactory(List<Customer> resultList) { |
| this.resultList = resultList; |
| }</pre> |
| </li> |
| <li>Implemente e, a seguir, modifique o método abstrato <tt>createKeys</tt>. |
| <pre class="examplecode">@Override |
| protected boolean createKeys(List<Customer> list) { |
| for (Customer customer : resultList) { |
| list.add(customer); |
| } |
| return true; |
| }</pre></li> |
| <li>Adicione um método par criar nós. |
| <pre class="examplecode">@Override |
| protected Node createNodeForKey(Customer c) { |
| try { |
| return new BeanNode(c); |
| } catch (IntrospectionException ex) { |
| Exceptions.printStackTrace(ex); |
| return null; |
| } |
| }</pre> |
| </li> |
| <li>Corrija as importações para importar o <tt>org.openide.nodes.Node</tt> e o <tt>java.beans.InstrospectionException</tt>. Salve as alterações.</li> |
| </ol> |
| |
| |
| <p>A classe se parecerá com:</p> |
| |
| <pre class="examplecode">package com.mycompany.mavenplatformcrudapp.viewer; |
| |
| import com.mycompany.mavenplatformcrudapp.dbaccess.Customer; |
| import java.beans.IntrospectionException; |
| import java.util.List; |
| import org.openide.nodes.BeanNode; |
| import org.openide.nodes.ChildFactory; |
| import org.openide.nodes.Node; |
| import org.openide.util.Exceptions; |
| |
| public class CustomerChildFactory extends ChildFactory<Customer> { |
| |
| private List<Customer> resultList; |
| |
| public CustomerChildFactory(List<Customer> resultList) { |
| this.resultList = resultList; |
| } @Override |
| protected boolean createKeys(List<Customer> list) { |
| for (Customer customer : resultList) { |
| list.add(customer); |
| } return true; } |
| @Override protected Node createNodeForKey(Customer c) { try { |
| return new BeanNode(c); |
| } catch (IntrospectionException ex) { |
| Exceptions.printStackTrace(ex); |
| return null; |
| } } |
| |
| }</pre> |
| |
| <p>É necessário modificar o <strong>CustomerTopComponent</strong> para utilizar o ExplorerManager para passar a lista de resultados da consulta JPA para o Nó.</p> |
| <ol> |
| <li>Adicione as linhas a seguir ao construtor CustomerTopComponent para definir o contexto da raiz para os nós e para adicionar o ActionMap do TopComponent e o ExplorerManager à Pesquisa do TopComponent. |
| |
| <pre class="examplecode"> |
| EntityManager entityManager = Persistence.createEntityManagerFactory("com.mycompany_MavenPlatformCRUDApp-dbaccess_nbm_1.0-SNAPSHOTPU").createEntityManager(); |
| Query query = entityManager.createQuery("SELECT c FROM Customer c"); |
| List<Customer> resultList = query.getResultList(); |
| <strong>em.setRootContext(new AbstractNode(Children.create(new CustomerChildFactory(resultList), true))); |
| associateLookup(ExplorerUtils.createLookup(em, getActionMap()));</strong></pre> |
| <!-- <li>Expand the Libraries node and change the dependency on <tt>org-openide-nodes</tt> and <tt>org-openide-explorer</tt> from transitive to direct.--> |
| |
| <p>Isto sincronizará a janela propriedades e o texto da dica de ferramenta para cada nó selecionado.</p> |
| </li> |
| <li>Corrija as importações e salve as alterações.</li> |
| </ol> |
| |
| |
| |
| <h3><a name="03d"></a>Executando do aplicativo</h3> |
| <p>Neste exercício será testado o aplicativo para confirmar que este é capaz de acessar e ler corretamente as tabelas do banco de dados. Antes de construir e executar o aplicativo é necessário modificar o POM pois o aplicativo exige uma dependência direta nos JARs <tt>org-openide-nodes</tt> e <tt>org-openide-explorer</tt>. É possível modificar a dependência na janela Projetos.</p> |
| |
| <ol> |
| <li>Amplie o nó Bibliotecas do módulo <strong>dbaccess</strong>.</li> |
| <li>Clique com o botão direito no JAR <tt>org-openide-nodes</tt> e selecione Declarar como dependência direta.</li> |
| <li>Clique com o botão direito no JAR <tt>org-openide-explorer</tt> e selecione Declarar como dependência direta.</li> |
| <li>Clique com o botão direito no <strong>aplicativo com base na plataforma NetBeans MavenPlatformCRUDApp</strong> e selecione Construir com dependências. |
| <p>A Janela de saída exibe os módulos que serão incluídos.</p> |
| <img src="../../images/tutorials/maven-crud/mavencrud-build-output1.png" alt="Captura de tela da Janela de saída - metade superior" title="Janela de saída mostrando a ordem de construção" class="margin-around b-all" /> |
| <p>A Janela de saída exibe também o status da construção.</p> |
| <img src="../../images/tutorials/maven-crud/mavencrud-build-output2.png" alt="Captura de tela da Janela de saída - metade inferior" title="Janela de saída mostrando que a construção foi bem sucedida" class="margin-around b-all" /> |
| </li> |
| <li>Clique com o botão direito do mouse no aplicativo e selecione Executar.</li> |
| </ol> |
| <p>Ao iniciar o aplicativo, a janela Cliente aparecerá com um nó para cada um dos registros na tabela do banco de dados.</p> |
| |
| <img src="../../images/tutorials/maven-crud/mavencrud-customer-window1.png" alt="Captura de tela da janela Cliente no aplicativo" title="janela Cliente no aplicativo" class="margin-around b-all" /> |
| <p>É possível clicar com o botão direito num nó na árvore da janela Cliente e selecionar Propriedades, para visualizar detalhes adicionais sobre o item.</p> |
| |
| |
| <img src="../../images/tutorials/maven-crud/mavencrud-read-properties.png" alt="Captura de tela da janela Propriedades no aplicativo" title="janela Propriedades mostrando detalhes do nó selecionado" class="margin-around b-all" /> |
| |
| </div> |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++++++ Implementing CRUD : UPDATE ++++++++++++++++++++ --> |
| |
| <h2><a name="04"></a>ATUALIZAÇÃO: Edição de um registro</h2> |
| |
| |
| <p>Nesta seção será adicionado um componente de janela para editar os detalhes de um registro.</p> |
| <div class="indent"> |
| <h3><a name="04a"></a>Criando a janela Editor</h3> |
| <p>Neste exercício será criada uma nova janela MyEditor a qual conterá dois campos de texto para a edição dos campos do nome e da cidade do nó selecionado. Será então modificado o arquivo <tt>layer.xml</tt> de maneira que a janela Cliente seja aberta no modo explorer ao invés de no modo editor.</p> |
| <ol> |
| <li>Clique com o botão direito no módulo <strong>dbaccess</strong> e selecione Nova > Janela.</li> |
| <li>Selecione <strong>editor</strong> na lista suspensa e selecione <strong>Abrir na inicialização do aplicativo</strong>. Clique em Próximo.</li> |
| <li>Digite <strong>MyEditor</strong> como o Prefixo do nome de classe.</li> |
| <li>Digite <strong>com.mycompany.mavenplatformcrudapp.editor</strong> como o pacote. Clique em Concluir.</li> |
| <li>Adicione dois JLabels e dois JTextFileds na visualização Desenho do <tt>MyEditorTopComponent</tt>. </li> |
| <li>Defina os textos dos rótulos como "Nome" e "Cidade" e defina os nomes das variáveis dos dois JTextFields como <tt><strong>jTextField1</strong></tt> e <tt><strong>jTextField2</strong></tt>. Salve as alterações.<br/> |
| <img src="../../images/tutorials/maven-crud/mavencrud-myeditor-window.png" alt="Captura de tela do componente de janela na visualização Desenho" title=" Componente de janela na visualização Desenho" class="margin-around b-all" /> |
| </li> |
| <li>Amplie o nó Arquivos importantes na janela Projetos e clique duas vezes na <strong>Camada XML</strong> para abrir o arquivo <tt>layer.xml</tt> no editor.</li> |
| <li>Modifique <tt>layer.xml</tt> para especificar que a janela CustomerTopComponent aparecerá no modo explorer. Salve as alterações. |
| <pre class="examplecode"> |
| <folder name="Modes"> |
| <folder name="editor"........<file name="MyEditorTopComponent.wstcref" url="MyEditorTopComponentWstcref.xml"/> |
| </folder><strong><folder name="explorer"> |
| <file name="CustomerTopComponent.wstcref" url="CustomerTopComponentWstcref.xml"/> |
| </folder></strong></folder> |
| </pre> |
| </li> |
| </ol> |
| |
| |
| <p>Agora é possível testar o aplicativo para certificar-se de que as janelas estejam abertas e situadas no local correto.</p> |
| <p class="tips">Lembre-se de limpar o aplicativo antes de construir utilizando dependências.</p> |
| |
| <p>Agora é possível adicionar o código de maneira que ao selecionar um nó na janela Cliente, os campos do nome e da cidade do objeto estejam exibidos no editor.</p> |
| |
| |
| <h3><a name="04b"></a>Utilizando um LookupListener</h3> |
| <p>Neste exercício será possível modificar a janela Cliente de maneira que quando um nó estiver selecionado, um novo objeto <tt>Cliente</tt> é adicionado à função Pesquisar do nó. Será então modificado o MyEditor de maneira que a janela implementará o <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/LookupListener.html">LookupListener</a></tt> para ouvir os objetos <tt>Clientes</tt> que foram adicionados à função Pesquisar.</p> |
| |
| <ol> |
| <li>Modifique o método <tt>createNodeForKey</tt> em <strong>CustomerChildFactory</strong> para criar um <tt>AbstractNode</tt> ao invés de um <tt>BeanNode</tt>. |
| <!--Do this by creating an AbstractNode, instead of a BeanNode, in the CustomerChildFactory class. |
| That enables you to add the current Customer object to the Lookup of the Node, as follows (note the part in bold):--> |
| <pre class="examplecode"> |
| @Override |
| protected Node createNodeForKey(Customer c) {<strong>Node node = new AbstractNode(Children.LEAF, Lookups.singleton(c)); |
| node.setDisplayName(c.getName()); |
| node.setShortDescription(c.getCity()); |
| return node;</strong>// tente { |
| // retorne o novo BeanNode(c); |
| // } capture (IntrospectionException ex) { |
| // Exceptions.printStackTrace(ex); |
| // retorne nulo; |
| // } |
| }</pre> |
| <p>Ao selecionar um novo nó na janela Cliente, o objeto selecionado <tt>Cliente</tt> é adicionado à função Pesquisar da janela.</p> |
| </li> |
| <!-- First, set a dependency in the editor module on the module that provides the entity class, |
| as well as the module that provides the persistence JARs. |
| --> |
| <li>Clique na aba Origem do <strong>MyEditorTopComponent</strong> e modifique a assinatura da classe para implementar o <tt>LookupListener</tt>. |
| <pre class="examplecode">public final class MyEditorTopComponent extends TopComponent <strong>implementa o LookupListener</strong></pre> |
| </li> |
| <li>Adicione uma variável para armazenar os resultados. |
| <pre class="examplecode">private Lookup.Result result = null;</pre> |
| </li> |
| <li>Implemente os métodos abstratos necessários para adicionar o método <tt>resultChanged</tt>.</li> |
| <li>Modifique o método <tt>resultChanged</tt> para atualizar o jTextFields toda vez que um novo objeto <tt>Cliente</tt> for introduzido na função Pesquisar. |
| <pre class="examplecode"> |
| @Override |
| public void resultChanged(LookupEvent le) { |
| Lookup.Result r = (Lookup.Result) le.getSource(); |
| Collection<Customer> coll = r.allInstances(); |
| if (!coll.isEmpty()) { |
| for (Customer cust : coll) { |
| jTextField1.setText(cust.getName()); |
| jTextField2.setText(cust.getCity()); |
| } |
| } else { |
| jTextField1.setText("[no name]"); |
| jTextField2.setText("[no city]"); |
| } |
| } |
| </pre> |
| |
| |
| <p>Após definir o LookupListener, é possível adicioná-lo ao <tt>Lookup.Result</tt> obtido a partir do contexto global. O contexto global aproxima o contexto do nó selecionado. Por exemplo, se o "Ford Motor Co" estiver selecionado na hierarquia da árvore, o objeto <tt>Cliente</tt> para "Ford Motor Co" é adicionado à função Pesquisar do nó. Como este é o nó atualmente selecionado, o objeto <tt>Cliente</tt> para "Ford Motor Co" está agora disponível no contexto global. Isso é, então, o que é passado para o <tt>resultChanged</tt>, fazendo com que os campos de texto sejam preenchidos.</p> |
| </li> |
| <li>Modifique os métodos <tt>componentOpened</tt> e <tt>componentClosed</tt> para ativar o LookupListener ao abrir a janela editor. |
| <pre class="examplecode"> |
| @Override |
| public void componentOpened() { |
| result = WindowManager.getDefault().findTopComponent("CustomerTopComponent").getLookup().lookupResult(Customer.class); |
| result.addLookupListener(this); |
| resultChanged(new LookupEvent(result)); |
| } |
| |
| @Override |
| public void componentClosed() { |
| result.removeLookupListener(this); |
| result = null; |
| }</pre> |
| <p>Como a janela editor está configurada para ser aberta quando for iniciado o aplicativo, o LookupListener também estará disponível na hora em que o aplicativo for iniciado.</p> |
| |
| <p>Neste exemplo está sendo utilizada a função Pesquisar fornecida pela janela Cliente. A janela é identificada explicitamente neste caso pela string "<tt>CustomerTopComponent</tt>". A string é especificada no código de origem do <tt>CustomerTopComponent</tt> como a ID do CustomerTopComponent. Esta abordagem funciona somente se o MyEditorTopComponent puder encontrar um TopComponent com a ID "CustomerTopComponent". |
| </p> |
| |
| <p class="tips">Uma abordagem mais flexível que envolve a regravação do modelo de seleção é descrita por Tim Bordeau, nesta <a href="http://weblogs.java.net/blog/timboudreau/archive/2007/01/how_to_replace.html">entrada de blog</a>.</p> |
| </li> |
| </ol> |
| |
| <p>É possível executar o aplicativo novamente após executar o comando Limpar e Construir com dependências. A janela editor estará atualizada ao selecionar um novo nó na janela Cliente. Nenhuma propriedade está exibida na janela Propriedades do nó uma vez que está sendo utilizado agora o <tt>AbstractNode</tt> ao invés do <tt>BeanNode</tt>.</p> |
| |
| |
| |
| |
| <h3><a name="04c"></a>Adição dos comandos Desfazer e Refazer</h3> |
| <p>Neste exercício serão ativadas funções Desfazer e Refazer ao implementar o gerenciador <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/UndoRedo.html">UndoRedo</a></tt>. Os botões Desfazer e Refazer na barra de ferramentas e os itens do menu Desfazer e Refazer serão ativados quando um usuário fizer uma alteração num dos campos na janela Editor.</p> |
| |
| <ol> |
| <li>Declare e instancie um novo UndoRedoManager na parte superior do MyEditorTopComponent. |
| <pre class="examplecode">private UndoRedo.Manager manager = new UndoRedo.Manager();</pre> |
| </li> |
| <li>Crie um método <tt>getUndoRedo()</tt> no MyEditorTopComponent: |
| <pre class="examplecode"> |
| @Override
|
| public UndoRedo getUndoRedo() {
|
| return manager;
|
| }</pre> |
| </li> |
| <li>Adicione os seguintes comandos ao construtor. |
| <!--In the constructor of MyEditorTopComponent, add a KeyListener to the jTextFields and, |
| within the related methods that you need to implement, add the UndoRedoListeners: |
| |
| what is happening here? |
| |
| |
| --> |
| <pre class="examplecode"> |
| jTextField1.getDocument().addUndoableEditListener(manager); |
| jTextField2.getDocument().addUndoableEditListener(manager);</pre> |
| </li> |
| </ol> |
| <p>É possível executar o aplicativo para testar os botões e itens do menu para as funções Desfazer e Refazer que estão em funcionamento.</p> |
| |
| |
| <h3><a name="04d"></a>Adicionando a função Salvar</h3> |
| |
| <p>Neste exercício será integrada a função Salvar plataforma NetBeans. O arquivo <tt>layer.xml</tt>será modificado para ocultar o botão "Salvar tudo" na barra de ferramentas e para adicionar o botão "Salvar". Serão adicionados então listeners para detectar alterações nos campos de texto e um método <tt>ativar</tt> que é ativado quando é detectada uma mudança. |
| |
| </p> |
| <ol> |
| <li>Abra e modifique o arquivo <tt>layer.xml</tt> do módulo <strong>dbaccess</strong> para adicionar um elemento Barra de ferramenta. |
| <pre class="examplecode"> |
| <strong><folder name="Toolbars"> |
| <folder name="File"> |
| <file name="org-openide-actions-SaveAction.shadow"> |
| <attr name="originalFile" stringvalue="Actions/System/org-openide-actions-SaveAction.instance"/> |
| <attr name="position" intvalue="444"/> |
| </file> |
| <file name="org-openide-actions-SaveAllAction.shadow_hidden"/> |
| </folder> |
| </folder></strong></filesystem></pre> |
| </li> |
| <li>No construtor <strong>MyEditorTopComponent</strong>, adicione a chamada seguinte para acionar um método quando for detectada uma alteração nos campos de texto. |
| <pre class="examplecode"> |
| public MyEditorTopComponent() { |
| |
| ... |
| jTextField1.getDocument().addUndoableEditListener(manager); |
| jTextField2.getDocument().addUndoableEditListener(manager); |
| |
| <strong>jTextField1.getDocument().addDocumentListener(new DocumentListener() { |
| public void insertUpdate(DocumentEvent arg0) { |
| fire(true); |
| } |
| public void removeUpdate(DocumentEvent arg0) { |
| fire(true); |
| } |
| public void changedUpdate(DocumentEvent arg0) { |
| fire(true); |
| } |
| }); |
| |
| jTextField2.getDocument().addDocumentListener(new DocumentListener() { |
| public void insertUpdate(DocumentEvent arg0) { |
| fire(true); |
| } |
| public void removeUpdate(DocumentEvent arg0) { |
| fire(true); |
| } |
| public void changedUpdate(DocumentEvent arg0) { |
| fire(true); |
| } |
| }); |
| |
| //Cria uma nova instância para a implementação SaveCookie: |
| impl = new SaveCookieImpl(); |
| |
| //Cria uma nova instância para o objeto dinâmico: |
| content = new InstanceContent(); |
| |
| //Adiciona o objeto dinâmico ao TopComponent Lookup: |
| associateLookup(new AbstractLookup(content));</strong> |
| |
| ... |
| }</pre> |
| </li> |
| <li>Adicione o método <tt>acionar</tt> que é chamado sempre que é detectada uma alteração. |
| |
| <pre class="examplecode"> |
| public void fire(boolean modified) { |
| if (modified) { |
| //Se o texto for modificado, |
| //adicione SaveCookie impl ao Lookup: |
| content.add(impl); |
| } else { |
| //Do contrário, remova o SaveCookie impl do lookup: |
| content.remove(impl); |
| } |
| }</pre> |
| </li> |
| <li>Adicione a implementação a seguir da função <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/cookies/SaveCookie.html">SalvarCookie</a></tt> que foi adicionada à <tt>InstanceContent</tt> pelo método <tt>acionar</tt>. |
| <pre class="examplecode"> |
| private class SaveCookieImpl implements SaveCookie { |
| |
| @Override |
| public void save() throws IOException { |
| |
| Confirmation message = new NotifyDescriptor.Confirmation("Do you want to save \"" |
| + jTextField1.getText() + " (" + jTextField2.getText() + ")\"?", |
| NotifyDescriptor.OK_CANCEL_OPTION, |
| NotifyDescriptor.QUESTION_MESSAGE); |
| |
| Object result = DialogDisplayer.getDefault().notify(message); |
| //Quando o usuário clica em "Sim", indicando que realmente deseja salvar, |
| //é necessário desabilitar a ação Salvar, |
| //de forma que isto só será utilizável quando for feita a próxima mudança //à JTextArea: |
| if (NotifyDescriptor.YES_OPTION.equals(result)) { |
| acionar(falso); |
| //Implemente aqui a função salvar. |
| } |
| } |
| }</pre> |
| </li> |
| <li>Adicione os campos a seguir ao MyEditorTopComponent. |
| <pre class="examplecode"> |
| private final SaveCookieImpl impl; |
| private final InstanceContent content; |
| </pre> |
| </li> |
| <li>Corrija as importações e salve as alterações.</li> |
| <li>Clique com o botão direito no JAR <tt>org-opnide-dialogs</tt> sob o nó Bibliotecas na janela Projetos e selecione Declarar como dependência direta.</li> |
| </ol> |
| <p>É possível agora limpar, construir com dependências e executar o aplicativo para confirmar que o botão Salvar esteja ativado ao modificar um campo de texto.</p> |
| |
| |
| <h3><a name="04e"></a>Alterações persistentes</h3> |
| |
| <p>No próximo exercício será adicionado o código para persistir as alterações. No momento, o aplicativo reconhece corretamente quando uma alteração é feita num campo e ativa a opção para salvar as mudanças. Ao clicar em Salvar, aparece uma caixa de diálogo solicitando que confirme que deseja salvar as alterações. No entanto, as alterações não persistem quando clica em OK na caixa de diálogo. Para vigorar as alterações, é necessário adicionar alguns códigos JPA para controlar a persistência do banco de dados. </p> |
| |
| <ol> |
| <li>Adicione os campos a seguir ao <strong>MyEditorTopComponent</strong>. |
| <pre class="examplecode">cliente Cliente privado;</pre> |
| </li> |
| <li>Adicione o código JPA para vigorar as alterações modificando o método <tt>salvar</tt> para substituir o comentário <tt>"//Implemente aqui a função Salvar." </tt> com o código a seguir. |
| <pre class="examplecode">@Override |
| public void save() throws IOException { |
| ... |
| if (NotifyDescriptor.YES_OPTION.equals(result)) { |
| fire(false); <strong> EntityManager entityManager = Persistence.createEntityManagerFactory("com.mycompany_MavenPlatformCRUDApp-dbaccess_nbm_1.0-SNAPSHOTPU").createEntityManager(); |
| entityManager.getTransaction().begin(); |
| Customer c = entityManager.find(Customer.class, customer.getCustomerId()); |
| c.setName(jTextField1.getText()); |
| c.setCity(jTextField2.getText()); |
| entityManager.getTransaction().commit();</strong> }}</pre> |
| <p class="tips">Verifique se o nome da unidade persistente está correto.</p> |
| <p>O "cliente" em <tt>customer.getCustomerId()</tt>está atualmente indefinido. Na próxima etapa será definido o <tt>cliente</tt> como o objeto atual <tt>Cliente</tt> usado para obter a ID do Cliente.</p> |
| </li> |
| <li>Adicione a linha a seguir em negrito ao método <tt>resultChanged</tt>. |
| <pre class="examplecode"> |
| @Override |
| public void resultChanged(LookupEvent le) { |
| Lookup.Result r = (Lookup.Result) le.getSource(); |
| Collection<Customer> coll = r.allInstances(); |
| if (!coll.isEmpty()) { |
| for (Customer cust : coll) { |
| <strong>customer = cust;</strong> jTextField1.setText(cust.getName()); |
| jTextField2.setText(cust.getCity()); |
| } |
| } else { |
| jTextField1.setText("[no name]"); |
| jTextField2.setText("[no city]"); |
| } |
| }</pre> |
| </li> |
| <li>Corrija as importações e salve as alterações.</li> |
| </ol> |
| <p>É possível executar o aplicativo e alterar alguns dados para testar se a função Salvar está funcionando corretamente e se persistem as alterações. No momento, o editor não atualiza os campos para refletir os dados alterados. Para verificar se os dados persistem será necessário reiniciar o aplicativo.</p> |
| |
| <p>No próximo exercício será adicionada uma função "Atualizar" que recarregará os dados do banco de dados e lhe permitirá visualizar as alterações no editor.</p> |
| |
| |
| |
| <h3><a name="04f"></a>Adição da função Atualizar</h3> |
| <p>Neste exercício será adicionada a funcionalidade para atualizar o observador do Cliente adicionando um item de menu "Atualizar" ao nó raiz na janela Cliente.</p> |
| |
| <ol> |
| <li>Clique com o botão direito do mouse no pacote <tt><strong>com.mycompany.mavenplatformcrudapp.viewer</strong></tt>e selecione Nova > Classe Java e crie uma classe chamada <strong>CustomerRootNode</strong>.</li> |
| <li>Modifique a classe para ampliar o <tt>AbstractNode</tt> e adicione os seguintes métodos. |
| <pre class="examplecode"> |
| public class CustomerRootNode extends AbstractNode { |
| |
| <strong> public CustomerRootNode(Children kids) { |
| super(kids); |
| setDisplayName("Root"); |
| } |
| |
| @Override |
| public Action[] getActions(boolean context) { |
| Action[] result = new Action[]{ |
| new RefreshAction()}; |
| return result; |
| } |
| |
| private final class RefreshAction extends AbstractAction { |
| |
| public RefreshAction() { |
| putValue(Action.NAME, "Refresh"); |
| } |
| |
| public void actionPerformed(ActionEvent e) { |
| CustomerTopComponent.refreshNode(); |
| } |
| }</strong>}</pre> |
| <p class="tips">Observe que a ação "Atualizar" está vinculado ao novo nó Raiz.</p> |
| </li> |
| <li>Corrija as importações para importar <strong><tt>javax.swing.Action</tt></strong>. Salve as alterações.</li> |
| <li>Modifique <strong>CustomerTopComponent</strong> para adicionar o método seguinte para atualizar a visualização: |
| <pre class="examplecode"> |
| public static void refreshNode() { |
| EntityManager entityManager = Persistence.createEntityManagerFactory("com.mycompany_MavenPlatformCRUDApp-dbaccess_nbm_1.0-SNAPSHOTPU").createEntityManager(); |
| Query query = entityManager.createQuery("SELECT c FROM Customer c"); |
| List<Customer> resultList = query.getResultList(); |
| em.setRootContext(new <strong>CustomerRootNode</strong>(Children.create(new CustomerChildFactory(resultList), true))); |
| }</pre> |
| <p>Observe que o método usa <strong>CustomerRootNode</strong> para configuração do contexto de raiz.</p> |
| <p class="tips">Na classe <tt>CustomerRootNode</tt>, é possível pressionar Alt+Enter na linha contendo <tt>refreshNode</tt> caso deseje que o IDE gere o esqueleto do método.</p> |
| </li> |
| <li>Modifique o código no construtor do CustomerTopComponent com uma chamada para <strong>CustomerRootNode</strong> ao invés de <strong>AbstractNode</strong>. |
| <p>Ao chamar o <tt>CustomerRootNode</tt> chama automaticamente o método <tt>refreshNode</tt> e invoca uma "Atualização".</p> |
| </li> |
| |
| <li>Corrija as importações e salve as alterações.</li> |
| </ol> |
| |
| <p>Caso execute o aplicativo, será possível ver que há um novo nó de raiz com uma ação "Atualizar" disponível no menu pop-up.</p> |
| |
| |
| <p class="tips">É possível reutilizar o método <tt>refreshNode</tt> e implementar uma atualização automática chamando o método <tt>refreshNode</tt>do método <tt>salvar</tt>. Alternativamente, seria possível criar um módulo separado contendo a ação atualizada e o módulo pode ser compartilhado entre os módulos.</p> |
| </div> |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++++++ Implementing CRUD : CREATE ++++++++++++++++++++ --> |
| |
| <h2><a name="05"></a>CRIAR: Adição de um novo registro</h2> |
| |
| <p>Nesta seção, você permite que o usuário crie uma nova entrada no banco de dados.</p> |
| <div class="indent"> |
| <h3><a name="05a"></a>Adicionando a ação Criar</h3> |
| <ol> |
| <li>Clique com o botão direito do mouse no módulo <strong>dbaccess</strong> e selecione Nova > Ação.</li> |
| <li>Selecione Sempre ativado. Clique em Próximo.</li> |
| <li>Selecione <strong>Arquivo</strong> na lista suspensa Categoria.</li> |
| <li>Selecione o botão Barra de ferramentas global. Clique em Próximo.<br/> |
| <img src="../../images/tutorials/maven-crud/mavencrud-new-action.png" alt="Captura de tela do assistente Nova ação " title="Registro GUI no assistente Nova ação" class="margin-around b-all" /> |
| |
| </li> |
| <li>Digite <strong>NovaAção</strong> para o nome da classe.</li> |
| <li>Digite <strong>Minha nova ação</strong> para o nome da exibição.</li> |
| <li>Clique no Navegador e selecione uma imagem que será usada na barra de ferramentas. |
| <p>É possível copiar a imagem a seguir <tt>abc16.png</tt> para a área de trabalho e especificar a imagem no assistente. ( <img src="../../images/tutorials/maven-crud/abc16.png" alt="Ícone do modelo 16 x 16" title="Ícone do modelo 16 x 16" /> ) |
| </p> |
| </li> |
| <li>Selecione o pacote <strong>com.mycompany.mavenplatformcrudapp.editor</strong>. Clique em Concluir.</li> |
| <li>Modifique a classe <tt>NovaAção</tt> para abrir o MyEditorTopComponent e apagar os campos. |
| <pre class="examplecode"> |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| |
| public final class NewAction implements ActionListener { |
| |
| public void actionPerformed(ActionEvent e) { |
| MyEditorTopComponent tc = MyEditorTopComponent.getDefault(); |
| tc.resetFields(); |
| tc.open(); |
| tc.requestActive(); |
| } |
| |
| }</pre> |
| |
| <p>A ação implementa a classe ActionListener, que está vinculada ao aplicativo através das entradas no arquivo de camada, colocada lá pelo assistente Nova ação.</p> |
| </li> |
| </ol> |
| |
| <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ --> |
| <!-- I am still hitting issue 186876 in the RC2 build --> |
| <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ --> |
| |
| <h3><a name="05b"></a>Crianbdo e salvando um objeto novo</h3> |
| <ol> |
| <li>Em <strong>MyEditorTopComponent</strong>, adicione o método a seguir para redefinir o JTextFields e criar um novo objeto <tt>Cliente</tt>. |
| <pre class="examplecode"> |
| public void resetFields() { |
| customer = new Customer(); |
| jTextField1.setText(""); |
| jTextField2.setText(""); |
| }</pre> |
| <p class="tips">Na classe <tt>NovaAção</tt> é possível pressionar Alt+Enter na chamada para <tt>redefinirCampos</tt> se deseja que o IDE gere um esqueleto do método em MyEditorTopComponent.</p> |
| </li> |
| <li>Em SaveCookie, assegure-se de que um retorno de nulo indica que uma nova entrada foi salva, ao invés da atualização de uma entrada existente: |
| <pre class="examplecode"> |
| public void save() throws IOException { |
| |
| Confirmation message = new NotifyDescriptor.Confirmation("Do you want to save \"" |
| + jTextField1.getText() + " (" + jTextField2.getText() + ")\"?", |
| NotifyDescriptor.OK_CANCEL_OPTION, |
| NotifyDescriptor.QUESTION_MESSAGE); |
| |
| Object result = DialogDisplayer.getDefault().notify(msg); |
| |
| //Quando o usuário clica em "Sim", indicando que realmente deseja salvar, |
| //é necessário disabilitar o botão Salvar e o item do menu Salvar, //de forma que isto só será utilizável quando for feita a próxima mudança //ao campo de texto: |
| if (NotifyDescriptor.YES_OPTION.equals(result)) { |
| fire(false); |
| EntityManager entityManager = Persistence.createEntityManagerFactory("CustomerLibraryPU").createEntityManager(); |
| entityManager.getTransaction().begin(); |
| <strong>if (customer.getCustomerId() != null) {</strong> Customer c = entityManager.find(Customer.class, cude.getCustomerId()); |
| c.setName(jTextField1.getText()); |
| c.setCity(jTextField2.getText()); |
| entityManager.getTransaction().commit(); <strong>} else { |
| Query query = entityManager.createQuery("SELECT c FROM Customer c"); |
| List<Customer> resultList = query.getResultList(); |
| customer.setCustomerId(resultList.size()+1); |
| customer.setName(jTextField1.getText()); |
| customer.setCity(jTextField2.getText()); |
| //adiciona mais campos que serão populados nas colunas zip e discountCode |
| customer.setZip("12345"); |
| customer.setDiscountCode(entityManager.find(DiscountCode.class, 'H')); |
| |
| entityManager.persist(customer); |
| entityManager.getTransaction().commit(); |
| }</strong> }</pre> |
| <p>O código também grava alguns dados arbitrários no DiscountCode uma vez que o campo não pode estar vazio.</p> |
| </li> |
| <li>Corrija as importações para importar o <tt><strong>javax.persistence.Query</strong></tt>. Salve as alterações.</li> |
| </ol> |
| |
| </div> |
| |
| |
| <!-- =================================================================== --> |
| <!-- ++++++++++++++++++++ Running the Application ++++++++++++++++++++++ --> |
| |
| <h2><a name="06"></a>Construindo e executando o aplicativo</h2> |
| <p>O aplicativo agora executa três das funções CRUD: Criar, Ler e Atualizar. Agora é possível construir e executar o aplicativo para verificar que todas as funções estão funcionando corretamente.</p> |
| <ol> |
| <li>Clique com o botão direito do mouse no nó do projeto do <strong>aplicativo com base na plataforma NetBeans MavenPlatformCRUDApp</strong> e selecione Limpar.</li> |
| <li>Clique com o botão direito do mouse no nó do projeto do <strong>aplicativo com base na plataforma NetBeans MavenPlatformCRUDApp</strong> e selecione Construir utilizando dependências.</li> |
| <li>Clique com o botão direito do mouse no nó do projeto do <strong>aplicativo com base na plataforma NetBeans MavenPlatformCRUDApp</strong> e selecione Executar.</li> |
| </ol> |
| |
| <p>Ao clicar em Executar, o IDE ativa o aplicativo da plataforma. O aplicativo preenche a árvore na janela Cliente com os nomes dos clientes no banco de dados. Ao selecionar um nó na janela Cliente, a janela Meu editor exibe o nome e a cidade do cliente selecionado. É possível modificar e salvar os dados nos campos Nome e Cidade. Para criar um novo cliente, clique no botão Minha ação na barra de ferramentas e insira um nome para a cidade no campo de texto vazio na janela Meu editor e, a seguir, clique em Salvar.</p> |
| <p> |
| <img src="../../images/tutorials/maven-crud/mavencrud-finished-app.png" alt="Captura de tela do aplicativo concluído" title=" Aplicativo concluído exibindo as janelas Cliente e Meu Editor." class="margin-around b-all" /> |
| </p> |
| <p class="tips">Após criar ou modificar um cliente, será necessário atualizar o nó Raiz na janela Cliente caso não tenha implementado a ação Atualizar na opção Salvar.</p> |
| |
| <p>Este tutorial demonstrou que criar um aplicativo da plataforma NetBeans utilizando Maven não é muito diferente de criar um aplicativo utilizando Ant. A principal diferença é entender como o POM Maven controla a montagem do aplicativo. Para mais exemplos sobre como construir aplicativos e módulos da plataforma NetBeans, consulte os tutoriais listados na <a href="https://netbeans.org/kb/trails/platform_pt_BR.html">Trilha de aprendizagem da plataforma NetBeans</a>.</p> |
| |
| <!-- ======================================================================================== --> |
| |
| |
| <h2><a name="nextsteps"></a>Veja também</h2> |
| |
| <p>Isto conclui o tutorial CRUD. Este documento descreve como utilizar a estrutrua de construção Maven para criar um novo aplicativo da plataforma NetBeans como a funcionalidade CRUD. Para mais informações sobre a criação e o desenvolvimento dos aplicativos, consulte os resursos a seguir.</p> |
| <ul> |
| <li><a href="https://netbeans.org/kb/trails/platform_pt_BR.html">Trilha de aprendizagem da plataforma NetBeans</a></li> |
| <li><a href="http://bits.netbeans.org/dev/javadoc/">Javadoc da API do NetBeans </a></li> |
| </ul> |
| |
| <p>Caso tenha qualquer dúvida sobre a plataforma NetBeans, sinta-se à vontade para nos mandar um e-mail para dev@platform.netbeans.org ou ou veja o <a href="https://netbeans.org/projects/platform/lists/dev/archive">arquivo de endereços da plataforma NetBeans</a>.</p> |
| |
| |
| <!-- ======================================================================================== --> |
| |
| |
| </body> |
| |
| </html> |