| <!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> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| <!-- -*- xhtml -*- --> |
| <title>Tutorial Visual Library do NetBeans para NetBeans Platform 6.0</title> |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css"> |
| <meta name="AUDIENCE" content="NBUSER"> |
| <meta name="TYPE" content="ARTICLE"> |
| <meta name="EXPIRES" content="N"> |
| <meta name="developer" content="geertjan.wielenga@sun.com"> |
| <meta name="indexed" content="y"> |
| <meta name="description" |
| content="A walk-through of the basic features of the Visual Library API."> |
| <!-- Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved. --> |
| <!-- Use is subject to license terms.--> |
| </head> |
| <body> |
| <h1>Tutorial Visual Library do NetBeans</h1> |
| |
| <p>Neste tutorial, você aprenderá como usar os recursos principais fornecidos pela API Visual Library do NetBeans. A API Visual Library é uma API de visualização, útil no contexto de, por exemplo, modelagem e gráficos. |
| |
| </p><p><b>Conteúdo</b></p> |
| |
| <img src="../../images/articles/60/netbeans-stamp60-61.gif" class="stamp" width="114" height="114" alt="O conteúdo desta página se aplica ao IDE NetBeans 6.1 " title="O conteúdo desta página se aplica ao IDE NetBeans 6.1"> </p> |
| <ul class="toc"> |
| <li><a href="#getting-started">Configurando o módulo</a> |
| </li><li><a href="#creating-the-scene">Criando a cena</a> |
| </li><li><a href="#creating-a-palette">Criando uma paleta de componentes da cena</a> |
| </li><li><a href="#adding-a-layer-widget">Adicionando um LayerWidget</a> |
| </li><li><a href="#adding-an-icon-widget">Adicionando um IconNodeWidget por meio da funcionalidade arrastar e soltar</a> |
| </li><li><a href="#adding-to-scene">Adicionando funcionalidade à cena</a> |
| </li><li><a href="#adding-to-widget">Adicionando funcionalidade ao IconNodeWidget</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">NetBeans IDE</td> |
| <td class="tbltd1">versão <a href="http://download.netbeans.org/netbeans/6.1/final/">versão 6.1</a> ou<br> |
| versão 6.0</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">Java Developer Kit (JDK)</td> |
| <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">versão 6</a> ou<br> |
| versão 5</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p class="tips">Opcionalmente, para fins de solução de problemas, você pode <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=2701">baixar a amostra completa</a> e inspecionar os códigos-fonte. |
| |
| </p><p>Além disso, você usará 3 ícones no tutorial. Você pode clicar com o botão direito do mouse neles e salvá-los localmente, em seguida, copie-os para a localização do projeto do módulo, depois de criar o projeto do módulo mias tarde neste tutorial. Aqui estão os 3 ícones: |
| |
| </p><p><img border="1" src="../../images/tutorials/vislib/image1.png"/> |
| <img border="1" src="../../images/tutorials/vislib/image2.png"/> |
| <img border="1" src="../../images/tutorials/vislib/image3.png"/> |
| |
| |
| </p><p>Todas as informações que você precisa saber para trabalhar com a API do Visual Library são coletadas nestes dois locais: |
| |
| </p><ul> |
| <li><a href="http://graph.netbeans.org/">Página do projeto do Visual Library</a> |
| </li><li><a href="http://graph.netbeans.org/documentation.html">Visual Library 2.0 - Documentação</a> |
| </li></ul> |
| |
| <p>Além disso, consulte o <a href="http://www.javalobby.org/eps/netbeans_visual_library/">Screencast sobre o Visual Library de Roman Strobl</a> em Javalobby. |
| |
| <!-- ===================================================================================== --> |
| |
| </p><p></p><h2><a name="getting-started"></a>Configurando o módulo</h2> |
| |
| <p>Nesta seção, usamos assistentes para criar um projeto do módulo e um componente de janela personalizado. |
| |
| </p><ol> |
| |
| <li>Escolha Arquivo > Novo projeto. No assistente para Novo projeto. escolha Módulos do NetBeans em Categorias e Módulos em Projetos. Clique em Próximo. Digite <tt>ShapeSample</tt> em Nome do projeto e defina Localização do projeto como uma pasta apropriada no disco. Se não estiverem selecionadas, selecione Módulo independente e Definir como projeto principal. Clique em Próximo. |
| |
| <p></p></li><li>Digite <tt>org.netbeans.shapesample</tt> em Nome de base de código e <tt>Amostra de forma</tt> em Nome de exibição do módulo. Clique em Terminar. |
| |
| |
| <p></p></li><li>Clique com o botão direito do mouse no projeto, escolha Propriedades, clique em Bibliotecas na caixa de diálogo Propriedades do projeto e declare uma dependência nas seguintes APIs: |
| |
| <p></p><ul> |
| <li>API do Visual Library |
| </li><li>API de utilitários |
| </li></ul> |
| |
| |
| <p>Clique em OK. |
| |
| </p><p></p></li><li>Clique com o botão direito do mouse no projeto do módulo, escolha Novo > Arquivo/pasta e escolha Componente da janela na categoria Desenvolvimento de módulo do NetBeans. Clique em Próximo. Escolha <tt>editor</tt> na lista suspensa e selecione Abrir ao iniciar aplicativo. Clique em Próximo. |
| |
| <p></p></li><li>Digite <tt>Shape</tt> no Prefixo do nome da classe. Opcionalmente, adicione um ícone com uma dimensão de 16x16 pixels. Clique em Terminar.</p> |
| |
| <p>Vários arquivos são gerados, um deles é <tt>ShapeTopComponent</tt>. Abra este arquivo no modo Design. O seguinte deverá ser exibido: |
| |
| </p><p><img border="1" src="../../images/tutorials/vislib/shapetopcomponent.png"/> |
| |
| |
| </p><p></p></li><li>Clique com o botão direito do mouse em TopComponent no modo Design, escolha Definir layout e selecione BorderLayout. |
| |
| </li></ol> |
| |
| |
| <p></p><h2><a name="creating-the-scene"></a>Criando a cena</h2> |
| |
| <p>A programação com a API do Visual Library é semelhante à programação em Swing. Você constrói e modifica uma árvore de elementos visuais que são chamados de "widgets". A raiz da árvore é representada por uma classe Cena que mantém todos os dados visuais da cena. A cena é um widget. Você tem que criar uma visualização de cena, que é um JComponent. Em seguida, você deve adicionar o JComponent a um JScrollPane. |
| |
| </p><p>Nesta seção, adicionamos um JScrollPane ao nosso TopComponent. Em seguida, crie uma nova cena. Em seguida, passamos a visualização Cena para o TopComponent, de forma que ele possa ser exibido no JScrollPane do TopComponent. Em seguida, instalamos o projeto do módulo e exibimos nossa primeira cena.</p> |
| |
| <ol> |
| |
| <li>Use a paleta (Ctrl-Shift-8) para soltar um <tt>JScrollPane</tt> no TopComponent. No Inspetor, clique com o botão direito do mouse em <tt>JScrollPane</tt>, escolha Alterar nome da variável e digite <tt>shapePane</tt>. |
| |
| <p></p></li><li>No pacote <tt>org.netbeans.shapesample</tt>, crie uma classe Java chamada <tt>GraphSceneImpl</tt>. Deixe a classe estender <tt>GraphScene</tt>.</p> |
| |
| <p>Um sublinhado de erro vermelho e uma lâmpada aparecem. Deixe o IDE gerar a instrução de importação. |
| |
| </p><p>Um sublinhado de erro vermelho e uma lâmpada aparecem novamente. Deixe o IDE gerar os métodos abstratos da classe. |
| |
| </p><p></p></li><li>Crie uma implementação fictícia da classe, adicionando identificadores significativos e configurando <tt>leftnull</tt> para ser retornado quando necessário, de forma que todos os requisitos da classe sejam atendidos: |
| |
| |
| <pre class="examplecode">public class GraphSceneImpl extends GraphScene { |
| |
| public GraphSceneImpl() { |
| } |
| |
| protected Widget attachNodeWidget(Object node) { |
| return null; |
| } |
| |
| protected Widget attachEdgeWidget(Object edge) { |
| return null; |
| } |
| |
| protected void attachEdgeSourceAnchor(Object edge, Object oldSourceNode, Object newSourceNode) { |
| |
| } |
| |
| protected void attachEdgeTargetAnchor(Object edge, Object oldTargetNode, Object newTargetNode) { |
| |
| } |
| |
| }</pre> |
| |
| <p></p></li><li>Agora use o construtor do TopComponent para manter uma instância da classe <tt>GraphSceneImpl</tt>. Para fazer isso, adicione o seguinte no fim do construtor da classe <tt>ShapeTopComponent</tt>: |
| |
| <pre class="examplecode">GraphSceneImpl scene = new GraphSceneImpl(); |
| myView = scene.createView(); |
| |
| shapePane.setViewportView(myView); |
| add(scene.createSatelliteView(), BorderLayout.WEST);</pre> |
| |
| <p>Observe que estamos criando duas visualizações. A primeira será uma visualização grande para ver seus gráficos ou modelos, etc. A segunda é uma visualização satélite, que colocamos no WEST (ou seja, o lado esquerdo) do TopComponent. Isso permitirá que o usuário navegue rapidamente pela visualização e oferece uma visão geral da cena inteira.</p> |
| |
| <p>Declare a visualização JComponent: |
| |
| </p><pre class="examplecode">private JComponent myView;</pre> |
| |
| |
| <p></p></li><li>Quando o IDE é reinicializado, não é necessário persistir o TopComponent. Na verdade, fazer isso causará um erro nesse caso. Portanto, altere PERSISTENCE_ALWAYS para PERSISTENCE_NEVER, como mostrado abaixo: |
| |
| <pre class="examplecode">public int getPersistenceType() { |
| return TopComponent.PERSISTENCE_NEVER; |
| }</pre> |
| |
| |
| <p></p></li><li>Clique com o botão direito do mouse no nó do projeto e escolha "Instalar/recarregar no IDE de desenvolvimento". Se uma mensagem de aviso aparecer, clique em OK.</p> |
| |
| <p>Quando o módulo é instalado, observe o menu Janela e você encontrará um nome item de menu chamado "Forma", no início da lista de itens de menu. Escolha-o e você verá o início da sua implementação da API do Visual Library: |
| |
| </p><p><img border="1" src="../../images/tutorials/vislib/firstscene.png"/> |
| |
| |
| |
| |
| </p></li> |
| |
| <!-- ===================================================================================== --> |
| <p></p><h2><a name="creating-a-palette"></a>Criando uma paleta de componentes da cena</h2> |
| |
| <p>Para fazer algo útil com a API do Visual Library, implementaremos a <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/overview-summary.html">API da paleta</a> de forma que terminemos com uma paleta de componentes contendo as formas mostradas no início deste tutorial. Mais tarde, adicionaremos a funcionalidade arrastar e soltar da API do Visual Library de forma que possamos arrastar e soltar as formas na cena. Depois disso, podermos enriquecer a cena com recursos adicionais, tais como a habilidade de colocar zoom e panorâmica na cena. |
| |
| </p><ol> |
| <li>Já que o foco deste tutorial é a API do Visual Library, e não a API da paleta, não perderemos tempo explicando como a API da paleta funciona. Existem muitos tutoriais sobre esse assunto (<a href="https://netbeans.org/kb/trails/platform.html">aqui</a>). Portanto, você pode simplesmente copiar e colar os arquivos seguintes em um novo pacote chamado <tt>org.netbeans.shapesample.palette</tt>: |
| |
| <ul> |
| <li><a href="../../images/tutorials/vislib/Category.java">Category.java</a> |
| </li><li><a href="../../images/tutorials/vislib/CategoryChildren.java">CategoryChildren.java</a> |
| </li><li><a href="../../images/tutorials/vislib/CategoryNode.java">CategoryNode.java</a> |
| </li><li><a href="../../images/tutorials/vislib/PaletteSupport.java">PaletteSupport.java</a> |
| </li><li><a href="../../images/tutorials/vislib/Shape.java">Shape.java</a> |
| </li><li><a href="../../images/tutorials/vislib/ShapeChildren.java">ShapeChildren.java</a> |
| </li><li><a href="../../images/tutorials/vislib/ShapeNode.java">ShapeNode.java</a> |
| </li></ul> |
| |
| |
| <p></p></li><li>Da mesma forma explicada na etapa 3 da seção chamada "Introdução", anteriormente neste tutorial, adicionamos dependências sobre a API de ações, a API de nós e a API de paleta comum.</p> |
| |
| |
| <p></p></li><li>Em seguida, adicionamos a paleta à pesquisa do TopComponent, adicionando esta linha no fim do construtor do TopComponent: |
| |
| <pre class="examplecode">associateLookup( Lookups.fixed( new Object[] { PaletteSupport.createPalette() } ) );</pre> |
| |
| <p></p></li><li>O IDE solicitará que você insira instruções de importação para <tt>org.openide.util.lookup.Lookups</tt> e <tt>org.netbeans.shapesample.palette.PaletteSupport</tt>. Aceite os avisos e permita que o IDE gere as instruções de importação. |
| |
| <p></p></li><li>Coloque as imagens encontradas no início deste tutorial no pacote <tt>org.netbeans.shapesample.palette</tt>.</p> |
| |
| <p>A janela Projetos agora deve ter esta aparência:</p> |
| |
| <p><img border="1" src="../../images/tutorials/vislib/proj-window.png"/> |
| |
| </p><p></p></li><li>Instale o módulo novamente. Quando você abre o TopComponent no item de menu, a nova paleta de componentes e mostrada à direita da cena:</p> |
| |
| <p><img border="1" src="../../images/tutorials/vislib/firstpalette.png"/> |
| |
| |
| |
| </p></li> |
| |
| <!-- ===================================================================================== --> |
| <p></p><h2><a name="adding-a-layer-widget"></a>Adicionando um LayerWidget</h2> |
| |
| <p>Um <a href="http://graph.netbeans.org/documentation.html#LayerWidget">LayerWidget</a> representa um painel de vidro, semelhante a JGlassPane em Swing. Ele é transparente por padrão. Portanto, antes de prosseguir, adicionaremos um LayerWidget à cena, portanto, temos algum lugar para colocar os widgets visíveis que arrastar e soltar na cena. |
| |
| </p><ol><li>Na classe <tt>GraphSceneImpl</tt>, declare a LayerWidget: |
| |
| <pre class="examplecode">private LayerWidget mainLayer;</pre> |
| |
| <p></p></li><li>No construtor da classe <tt>GraphSceneImpl</tt>, adicione a LayerWidget como uma filha da cena: |
| |
| <pre class="examplecode">mainLayer = new LayerWidget (this); |
| addChild (mainLayer);</pre></li></ol> |
| |
| <p>Agora, quando arrastamos e soltamos itens da paleta como widgets na cena, os adicionaremos como filhos de LayerWidget. Como LayerWidgets são transparentes por padrão, você poderia ter vários LayerWidgets transparentemente um em cima do outro, de forma que, por exemplo, possa adicionar uma imagem de segundo plano à cena. |
| |
| </p><p>Para obter detalhes, consulte <a href="http://graph.netbeans.org/documentation.html#LayerWidget">LayerWidget</a> no Javadoc. |
| |
| <!-- ===================================================================================== --> |
| </p><p></p><h2><a name="adding-an-icon-widget"></a>Adicionando um IconNodeWidget por meio da funcionalidade arrastar e soltar</h2> |
| |
| <p>Anteriormente, usamos o construtor da classe <tt>GraphSceneImpl</tt> para passar uma cena para o JScrollPane do TopComponent. Até aqui, a cena existe mas não tem comportamento. O comportamento é adicionado através de ações. A ação que examinaremos nesta seção se chama <tt><a href="http://graph.netbeans.org/documentation.html#AcceptAction">AcceptAction</a></tt>. Essa ação ativa a funcionalidade arrastar e soltar. A funcionalidade arrastar e soltar poderia ser aplicada a um widget, mas aqui a aplicamos à cena em si. |
| |
| </p><p>Usamos <tt>createAcceptAction</tt> para especificar o que deve acontecer quando um item da paleta é arrastado sobre a cena. Dois métodos são envolvidos aqui. A primeira, <tt>isAcceptable()</tt>, é usada para determinar se o item pode ser aceito na cena. Aqui você pode testar o item, usando a transferência. Você também pode definir a imagem arrastada, que é tudo o que fazemos na implementação abaixo. Se <tt>true</tt> for retornado, o método <tt>accept</tt> é chamado. Aqui obtemos a imagem da transferência, usando o mesmo método de ajuda anterior. Em seguida, chamamos o método <tt>addNode</tt>, instanciando um novo <a href="http://graph.netbeans.org/documentation.html#IconNodeWidget">IconNodeWidget</a> e passando a imagem recuperada da transferência. |
| |
| </p><p>Todo código desta seção é inter-relacionado, e você receberá sublinhados de erro vermelhos em seu código até que todos os métodos abaixo tenham sido adicionados, mas tentaremos adicionar tudo de uma forma lógica! |
| |
| </p><ol> |
| <li>Primeiro, adicione <tt>createAcceptAction</tt>, com seus dois métodos, ao construtor da classe <tt>GraphSceneImpl</tt>: |
| |
| <pre class="examplecode">getActions().addAction(ActionFactory.createAcceptAction(new AcceptProvider() { |
| |
| public ConnectorState isAcceptable(Widget widget, Point point, Transferable transferable) { |
| Image dragImage = getImageFromTransferable(transferable); |
| JComponent view = getView(); |
| Graphics2D g2 = (Graphics2D) view.getGraphics(); |
| Rectangle visRect = view.getVisibleRect(); |
| view.paintImmediately(visRect.x, visRect.y, visRect.width, visRect.height); |
| g2.drawImage(dragImage, |
| AffineTransform.getTranslateInstance(point.getLocation().getX(), |
| point.getLocation().getY()), |
| null); |
| return ConnectorState.ACCEPT; |
| } |
| |
| public void accept(Widget widget, Point point, Transferable transferable) { |
| Image image = getImageFromTransferable(transferable); |
| Widget w = GraphSceneImpl.this.addNode(new MyNode(image)); |
| w.setPreferredLocation(widget.convertLocalToScene(point)); |
| } |
| |
| }));</pre> |
| |
| <p><b>Observação:</b> depois de adicionar o código acima, alguns sublinhados vermelhos permanecerão, indique que há erros. Esses erros acontecem porque o código acima se refere a um método e a uma classe que ainda não foram criados. Você irá criá-los nas próximas etapas. |
| |
| </p><p></p></li><li>Em seguida, na classe <tt>GraphSceneImpl</tt>, adicione um método de ajuda para recuperar a imagem da transferência: |
| |
| <pre class="examplecode">private Image getImageFromTransferable(Transferable transferable) { |
| Object o = null; |
| try { |
| o = transferable.getTransferData(DataFlavor.imageFlavor); |
| } catch (IOException ex) { |
| ex.printStackTrace(); |
| } catch (UnsupportedFlavorException ex) { |
| ex.printStackTrace(); |
| } |
| return o instanceof Image ? (Imagem) o : Utilities.loadImage("org/netbeans/shapesample/palette/shape1.png"); |
| }</pre> |
| |
| <p>Observe que você pode definir qualquer tipo de imagem quando uma imagem não é retornada com êxito desse método de ajuda. Por enquanto, usaremos a imagem "<tt>shape1.png</tt>" em vez disso.</p> |
| |
| <p></p></li><li>Crie uma nova classe chamada <tt>MyNode</tt>. Essa classe representa um nó em um modelo orientado a gráfico. Ela não pode ser uma imagem diretamente, já que cada nó deve ser único (verificado pelo método "equals") no modelo. Se você quisesse usar as imagens diretamente, então, poderia ter somente 3 nós (um para cada imagem) na cena. Usando a classe MyNode, você pode ter vários nós e cada nó pode ter sua própria instância de imagem ou uma compartilhada. |
| |
| <pre class="examplecode">public class MyNode { |
| |
| private Image image; |
| |
| public MyNode(Image image) { |
| this.image = image; |
| } |
| |
| public Image getImage() { |
| return image; |
| } |
| }</pre> |
| |
| <p></p></li><li>Altere a assinatura da classe <tt>GraphSceneImpl</tt> para o seguinte, de forma que o nó seja recebido pela classe de implementação do Visual Library:</li> |
| |
| <pre class="examplecode">extends GraphScene<MyNode, String></pre> |
| |
| <p>Você deve deixar o IDE gerar novos stubs para os métodos abstratos. |
| |
| </p><p>Além disso, já que agora estamos usando genéricos, certifique-se de que o IDE esteja usando o JDK 1.5. Se você não tem certeza se o 1.6 está sendo usado, clique com o botão direito do mouse no projeto, escolha Propriedades e vá para a página Códigos-fonte. Altere a lista suspensa Nível do código-fonte para 1.5. |
| |
| </p><p></p><li>Finalmente, defina o novo widget na classe <tt>GraphSceneImpl</tt>. Esse método é chamado automaticamente pelo método <tt>accept</tt>. Use-o para definir o widget do Visual Library quando o item da paleta for solto. |
| |
| <pre class="examplecode">protected Widget attachNodeWidget(MyNode node) { |
| IconNodeWidget widget = new IconNodeWidget(this); |
| widget.setImage(node.getImage()); |
| widget.setLabel(Long.toString(node.hashCode())); |
| widget.getActions().addAction(ActionFactory.createMoveAction()); |
| mainLayer.addChild(widget); |
| return widget; |
| }</pre> |
| |
| <p>Observe que definimos a imagem recuperada do no. Também geramos um número aleatório para que tenhamos um rótulo. Por padrão, o widget existe mas não tem comportamento. Aqui, criamos uma ação de movimento, de forma que o widget possa ser movido na cena. Finalmente, antes de retornar o widget para a cena, o adicionamos como um filho ao LayerWidget que criamos na seção anterior.</p> |
| |
| <p></p></li><li>Recarregue o módulo e abra-o na janela Forma novamente.</p> |
| |
| <p>Agora você pode arrastar e saltar itens da paleta. Conforme você arrastar um item sobre a cena, você verá a imagem arrastada. Quando você solta um item, ele se torna um widget e fica visível na cena, assim como na visualização satélite, como você pode ver aqui: |
| |
| </p><p><img border="1" src="../../images/tutorials/vislib/finishedscene.png"/></p> |
| |
| |
| </li></ol> |
| |
| |
| <!-- ===================================================================================== --> |
| <p></p><h2><a name="adding-to-scene"></a>Adicionando funcionalidade à cena</h2> |
| |
| <p>Na cena anterior, adicionamos <tt><a href="http://graph.netbeans.org/documentation.html#AcceptAction">AcceptAction</a></tt> à cena. Tínhamos que definir dois métodos para especificar se o item deve ser solto e para resolver o item. Nesta seção, usamos <tt><a href="http://graph.netbeans.org/documentation.html#ZoomAction">ZoomAction</a></tt>, para adicionar a funcionalidade mais zoom/menos zoom à cena. |
| |
| </p><ol> |
| <li>No fim do construtor da classe <tt>GraphSceneImpl</tt>, adicione esta linha: |
| |
| <pre class="examplecode">getActions().addAction(ActionFactory.createZoomAction());</pre> |
| |
| <p></p></li><li>Instale o módulo novamente. |
| |
| <p></p></li><li>Enquanto mantém a tecla CTRL pressionada, use a roda do mouse para colocar mais zoom e menos zoom na cena:</p> |
| |
| <p><img border="1" src="../../images/tutorials/vislib/zoom.png"/></p> |
| |
| <p><img border="1" src="../../images/tutorials/vislib/unzoom.png"/></p> |
| |
| </li></ol> |
| |
| <p><b>Observação:</b> As formas são renderizadas como imagens. SVG não tem suporte no momento. |
| |
| </p><p>Da mesma forma descrita acima, você pode adicionar a funcionalidade Panorâmica à cena, por meio desta linha: |
| |
| </p><pre class="examplecode">getActions().addAction(ActionFactory.createPanAction());</pre> |
| |
| <p>Quando você adicionar essa linha, o usuário poderá manter a roda do mouse pressionada e rolar em qualquer direção na cena. |
| |
| <!-- ===================================================================================== --> |
| </p><p></p><h2><a name="adding-to-widget"></a>Adicionando funcionalidade ao IconNodeWidget</h2> |
| |
| <p>Anteriormente, adicionamos <tt><a href="http://graph.netbeans.org/documentation.html#MoveAction">MoveAction</a></tt> ao IconNodeWidget, para ativar o comportamento de movimentação do widget. Dessa forma, muitos outros comportamentos podem ser adicionados ao widget. Nesta seção, adicionamos <tt><a href="http://graph.netbeans.org/documentation.html#HoverAction">HoverAction</a></tt>, <tt><a href="http://graph.netbeans.org/documentation.html#SelectAction">SelectAction</a></tt> e <tt><a href="http://graph.netbeans.org/documentation.html#InplaceEditorAction">InplaceEditorAction</a></tt>. |
| |
| </p><p>O <tt>InplaceEditorAction</tt> permitirá que o usuário altere o rótulo: |
| |
| </p><p><img border="1" src="../../images/tutorials/vislib/editable.png"/></p> |
| |
| <p>O <tt>SelectAction</tt> irá alterar a cor do rótulo quando o widget for selecionado, enquanto o <tt>HoverAction</tt> irá alterar a cor do rótulo quando o mouse passar sobre o widget: |
| |
| </p><p><img border="1" src="../../images/tutorials/vislib/selectable-hoverable.png"/></p> |
| |
| |
| <ol> |
| <p></p><li>Primeiro, defina a ação do editor que adicionaremos ao IconNodeWidget: |
| |
| <pre class="examplecode">private WidgetAction editorAction = ActionFactory.createInplaceEditorAction(new LabelTextFieldEditor());</pre> |
| |
| <p></p></li><li>Agora, defina o <tt>LabelTextFieldEditor</tt>, da seguinte forma: |
| |
| <pre class="examplecode">private class LabelTextFieldEditor implements TextFieldInplaceEditor { |
| |
| public boolean isEnabled(Widget widget) { |
| return true; |
| } |
| |
| public String getText(Widget widget) { |
| return ((LabelWidget) widget).getLabel(); |
| } |
| |
| public void setText(Widget widget, String text) { |
| ((LabelWidget) widget).setLabel(text); |
| } |
| |
| }</pre> |
| |
| <p></p></li><li>Finalmente, atribua a ação do editor ao IconNodeWidget, na mesma forma feita com a ação de movimento anteriormente: |
| |
| <pre class="examplecode">widget.getLabelWidget().getActions().addAction(editorAction);</pre> |
| |
| <p>Aqui, primeiro obtemos o LabelWidget do IconNodeWidget. Em seguida, adicionamos a ação do editor ao LabelWidget.</p> |
| |
| <p></p></li><li>O IDE solicita que você adicione várias instruções de importação. Em cada caso, aceite a sugestão oferecida pelo IDE. |
| |
| <p></p></li><li>Em seguida, no caso de <tt>SelectAction</tt> e <tt>HoverAction</tt>, você não precisa fazer nada além de atribuir essas ações ao IconNodeWidget: |
| |
| <pre class="examplecode">widget.getActions().addAction(createSelectAction()); |
| widget.getActions().addAction(createObjectHoverAction());</pre> |
| |
| <p></p></li><li>Em seguida, você precisa pensar sobre a ordem das ações criadas. Para obter detalhes, consulte a seção <a href="http://graph.netbeans.org/documentation.html#OrderOfActions">Ordem de ações</a> na documentação. Depois de reordenar as ações, o <tt>attachNodeWidget</tt> deve ter a seguinte aparência: |
| |
| <pre class="examplecode">protected Widget attachNodeWidget(MyNode node) { |
| IconNodeWidget widget = new IconNodeWidget(this); |
| widget.setImage(node.getImage()); |
| widget.setLabel(Long.toString(node.hashCode())); |
| |
| //double-click, the event is consumed while double-clicking only: |
| widget.getLabelWidget().getActions().addAction(editorAction); |
| |
| //single-click, the event is not consumed: |
| widget.getActions().addAction(createSelectAction()); |
| |
| //mouse-dragged, the event is consumed while mouse is dragged: |
| widget.getActions().addAction(ActionFactory.createMoveAction()); |
| |
| //mouse-over, the event is consumed while the mouse is over the widget: |
| widget.getActions().addAction(createObjectHoverAction()); |
| |
| mainLayer.addChild(widget); |
| return widget; |
| }</pre> |
| |
| <p></p></li><li>Instale e experimente o módulo novamente. Como mostrado no início desta seção, quando você passar o mouse sobre o rótulo do widget, ou quando você o selecionar, sua cor mudará. Além disso, quando você clica em um rótulo, é possível editar seu conteúdo. |
| |
| </li></ol> |
| |
| <p>Parabéns, você concluiu o Tutorial do Visual Library 2.0 para NetBeans 6.0.</p> |
| |
| <br> |
| <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&subject=Feedback:%20Visual%20Library%20API%20Tutorial%20NetBeans%206.0">Envie-nos seus comentários</a></div> |
| <br style="clear:both;" /> |
| |
| |
| <a name="next_steps"></a><h2>Próximas etapas</h2> |
| <p>Para obter mais informações sobre como trabalhar com a API do Visual Library, consulte:</p> |
| |
| <ul> |
| <li><a href="http://www.javalobby.org/eps/netbeans_visual_library/">Screencast sobre o Visual Library de Roman Strobl</a> em Javalobby. |
| </li><li><a href="http://graph.netbeans.org/">Página do projeto do Visual Library</a> |
| </li><li><a href="http://graph.netbeans.org/documentation.html">Visual Library 2.0 - Documentação</a> |
| </li></ul> |
| |
| |
| </ol></ol></body> |
| </html> |