<!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>
<!-- -*- xhtml -*- -->
<title>NetBeans Visual Library Tutorial for NetBeans Platform 6.0</title>
  <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"> 
  <meta name="AUDIENCE" content="NBUSER">
  <meta name="TYPE" content="ARTICLE">
  <meta name="EXPIRES" content="N">
  <meta name="developer" content="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>NetBeans Visual Library Tutorial</h1>

<p>In this tutorial, you will learn how to use the main
 features provided by the NetBeans Visual Library API. The Visual Library API
  is a visualization API, useful in the context of, for example, modeling
   and graphs.

    <p><strong class="notes">Note: </strong>This is not the latest version of this
      document. It applies to NetBeans IDE 6.0/6.1 only.
      <a href="../nbm-visual_library.html">Click here</a> to
      see the most up to date version.
   

     <p><b>Contents</b></p>
   
      <img  src="../../images/articles/60/netbeans-stamp60-61.gif" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.1" title="Content on this page applies to NetBeans IDE 6.1"> </p>
      <ul class="toc">
<li><a href="#getting-started">Setting Up the Module</a>
<li><a href="#creating-the-scene">Creating the Scene</a>
<li><a href="#creating-a-palette">Creating a Component Palette for the Scene</a>
<li><a href="#adding-a-layer-widget">Adding a LayerWidget</a>
<li><a href="#adding-an-icon-widget">Adding an IconNodeWidget via Drag and Drop Functionality</a>
<li><a href="#adding-to-scene">Adding Functionality to the Scene</a>
<li><a href="#adding-to-widget">Adding Functionality to the IconNodeWidget</a>
       </ul>
         
<p><b>To follow this tutorial, you need the software and resources listed in the following 
table.</b></p>

    <table>
        <tbody>
            <tr>
                <th class="tblheader" scope="col">Software or Resource</th>
                <th class="tblheader" scope="col">Version Required</th>
            </tr> 
             <tr>
                <td class="tbltd1">NetBeans IDE</td>
                <td class="tbltd1">version 
                <a href="http://download.netbeans.org/netbeans/6.1/final/">version 6.1</a> or<br>
                version 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">version 6</a> or<br>
                version 5</td>
            </tr>
        </tbody>
    </table>

   <p class="tips">Optionally, for troubleshooting purposes, you can <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=2701">download the
   completed sample</a> and inspect the sources.

  <p>Also, you will use 3 icons in the tutorial. You can right-click
   them here and save them locally, then copy them to the module project's
   location, after you create the module project later in this tutorial. Here are
   the 3 icons:
  
   <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>All the information you need to know for working with the Visual Library API
 is collected at these two locations:
  
 <ul>
     <li><a href="http://graph.netbeans.org/">Visual Library Project Page</a>
     <li><a href="http://graph.netbeans.org/documentation.html">Visual Library 2.0 - Documentation</a>
 </ul>
 
 <p>Also, see <a href="http://www.javalobby.org/eps/netbeans_visual_library/">Roman Strobl's Visual Library
Screencast</a> on Javalobby.
 
<!-- ===================================================================================== -->

<p><h2><a name="getting-started"></a>Setting Up the Module</h2>

<p>In this section, we use wizards to create a module project and
 a custom window component. 

<ol>

<li>Choose File &gt; New Project. In the New Project wizard,
 choose NetBeans Modules under Categories and Module
 under Projects. Click Next. Type <tt>ShapeSample</tt> in Project Name
  and set Project Location to an appropriate folder on your disk. If they
 are not selected, select
   Standalone Module and Set as Main Project. Click Next.
  
   <p><li>Type <tt>org.netbeans.shapesample</tt> in Code Name Base
    and <tt>Shape Sample</tt> in Module Display Name. Click Finish.

    
 <p><li>Right-click the project, choose Properties, click Libraries 
in the Project Properties dialog box and declare a dependency on the following APIs:
 
<p><ul>
    <li>Visual Library API
    <li>Utilities API
</ul>


  <p>Click OK.
  
<p><li>Right-click the module project, choose
 New &gt; Other and choose Window Component from the
 NetBeans Module Development category. Click Next. Choose <tt>editor</tt>
 in the drop-down list and select Open on Application Start. Click Next.
 
 <p><li>Type <tt>Shape</tt> in Class Name Prefix. Optionally,
 add an icon with a dimension of 16x16 pixels. Click Finish.</p> 
 
 <p>Multiple files are generated, one of them is <tt>ShapeTopComponent</tt>.
 Open this file in Design mode. You should now see this:
 
 <p><img border="1" src="../../images/tutorials/vislib/shapetopcomponent.png"/>

 
<p><li>Right-click in the TopComponent in Design mode, choose Set Layout,
  and select BorderLayout. 

</ol>
  

<p><h2><a name="creating-the-scene"></a>Creating the Scene</h2>

<p>Programming with the Visual Library API is similar to programming in Swing. You build
  and modify a tree of visual elements that are called "widgets". The root of the tree is 
 represented by a Scene class which holds all the visual data of the scene. The scene is a widget. 
 You have to create a scene view, which is a JComponent. You must then add
 the JComponent to a JScrollPane.

 <p>In this section,
 we add a JScrollPane to our TopComponent. Then we create a new
  scene. Next, we pass the scene view to the TopComponent, so that it can be displayed in
 the TopComponent's JScrollPane. We then install the module project and display
   our first scene.</p>

<ol>
  
<li>Use the Palette (Ctrl-Shift-8) to drop a 
 <tt>JScrollPane</tt> on the TopComponent. In the Inspector, right-click
  the <tt>JScrollPane</tt>, choose Change Variable Name and type <tt>shapePane</tt>. 
 
  <p><li>In the <tt>org.netbeans.shapesample</tt> package, create a Java class called <tt>GraphSceneImpl</tt>.
  Let the class extend <tt>GraphScene</tt>.</p>

<p>A red error underline and a lightbulb appears. Let the IDE generate the import statement.

<p>A red error underline and a lightbulb appears again. Let the IDE generate the class's abstract methods.

<p><li>Create a dummy implementation of the class by adding
meaningful identifiers and setting <tt>null</tt> to be returned where necessary, 
so that all of the class's requirements are fulfilled:

  
<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><li>Now use the TopComponent's 
constructor to hold an instance of the <tt>GraphSceneImpl</tt> class. To do so, add
the following to the end of the <tt>ShapeTopComponent</tt> class's constructor:

<pre class="examplecode">GraphSceneImpl scene = new GraphSceneImpl();
myView = scene.createView();

shapePane.setViewportView(myView);
add(scene.createSatelliteView(), BorderLayout.WEST);</pre>

<p>Notice that we are creating two views. The first will be a large view for
 visualization of your graphs or models, and so on. The second is a satellite view,
 which we have placed in the WEST (i.e., the left side) of the TopComponent. This will
 let the user navigate quickly across the view and gives an overview of the entire scene.</p>
 
<p>Declare the view JComponent:

<pre class="examplecode">private JComponent myView;</pre>

 
<p><li>When the IDE restarts, there's no need to persist the TopComponent. In fact,
 doing so will cause an error in this case. Therefore, change PERSISTENCE_ALWAYS
  to PERSISTENCE_NEVER, as shown below:

<pre class="examplecode">public int getPersistenceType() {
   return TopComponent.PERSISTENCE_NEVER;
}</pre>

 
<p><li>Right-click the project node and choose "Install/Reload 
in Development IDE". If a warning message appears, click OK.</p>
 
<p>When the module installs, look under the Window menu and you will find a new menu item
 called "Shape", at the top of the list of menu items. 
 Choose it and you will see the start of your Visual Library API implementation:

 <p><img border="1" src="../../images/tutorials/vislib/firstscene.png"/>
 
 


</ol>

<!-- ===================================================================================== -->
<p><h2><a name="creating-a-palette"></a>Creating a Component Palette for the Scene</h2>

<p>To do something useful with the Visual Library API, we will implement the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/overview-summary.html">Palette API</a>
 so that we end up with a Component Palette containing the shapes shown at the start of this
 tutorial. Later, we will add the Visual Library API's drag and drop functionality so that 
 we can drag and drop the shapes
 into the scene. After that, we will be able to enrich the scene with additional features,
 such as the ability to zoom and pan in the scene.
 
     <ol>
         <li>Since the focus of this tutorial is the Visual Library API, and not the Palette API,
         no time will be spent here explaining how the Palette API works. Many tutorials
         exist on this subject already (<a href="https://netbeans.org/kb/trails/platform.html">here</a>).
         Therefore, you can simply copy and paste the following files into a new package
         called <tt>org.netbeans.shapesample.palette</tt>:
         
         <ul>
             <li><a href="../../images/tutorials/vislib/Category.java">Category.java</a>
             <li><a href="../../images/tutorials/vislib/CategoryChildren.java">CategoryChildren.java</a>  
             <li><a href="../../images/tutorials/vislib/CategoryNode.java">CategoryNode.java</a>
             <li><a href="../../images/tutorials/vislib/PaletteSupport.java">PaletteSupport.java</a>
             <li><a href="../../images/tutorials/vislib/Shape.java">Shape.java</a>
             <li><a href="../../images/tutorials/vislib/ShapeChildren.java">ShapeChildren.java</a>
             <li><a href="../../images/tutorials/vislib/ShapeNode.java">ShapeNode.java</a>
         </ul>

                  
         <p><li>In the same way as explained in step 3 of the section called "Getting Started", earlier in this tutorial,
         add dependencies on the Actions API, Nodes API, and Common Palette API.</p>

         
         <p><li>Next, add the palette to the TopComponent's Lookup, by adding this
         line to the end of the TopComponent's constructor:
         
         <pre class="examplecode">associateLookup( Lookups.fixed( new Object[] { PaletteSupport.createPalette() } ) );</pre>
         
         <p><li>The IDE will prompt you to insert import statements for <tt>org.openide.util.lookup.Lookups</tt>
         and <tt>org.netbeans.shapesample.palette.PaletteSupport</tt>. Accept the prompts and let
         the IDE generate the import statements.
         
         <p><li>Place the images found at the start of this tutorial
         into the <tt>org.netbeans.shapesample.palette</tt> package.</p>

         <p>The Projects window should now look as follows:</p>
     
     <p><img border="1" src="../../images/tutorials/vislib/proj-window.png"/>
     
     <p><li>Install the module again. When you open the TopComponent from the menu item, the new 
     Component Palette is shown to the right of the scene:</p>
 
  <p><img border="1" src="../../images/tutorials/vislib/firstpalette.png"/>
 
 
 
</ol>
  
<!-- ===================================================================================== -->
<p><h2><a name="adding-a-layer-widget"></a>Adding a LayerWidget</h2>

<p>A <a href="http://graph.netbeans.org/documentation.html#LayerWidget">LayerWidget</a>
 represents a glasspane, similar to JGlassPane in Swing. It is transparent by default. So,
  before we go any further, we will add a LayerWidget to the scene, so that
   we have somewhere to place the visible widgets that we will drag and drop onto the scene.
   
   <ol><li>In the <tt>GraphSceneImpl</tt> class, declare the LayerWidget:
   
<pre class="examplecode">private LayerWidget mainLayer;</pre>

<p><li>In the <tt>GraphSceneImpl</tt> class's constructor, add the LayerWidget
 as a child of the scene:

<pre class="examplecode">mainLayer = new LayerWidget (this);
addChild (mainLayer);</pre></ol>

<p>Now, when we drag and drop items from the palette as widgets to the scene,
 we will add them as children of the LayerWidget. Because LayerWidgets are
  transparent by default, you could have various LayerWidgets transparently on
   top of each other so that, for example, you can add a background image to the scene.
   
   <p>For details, see <a href="http://graph.netbeans.org/documentation.html#LayerWidget">LayerWidget</a>
    in the Javadoc.

<!-- ===================================================================================== -->
<p><h2><a name="adding-an-icon-widget"></a>Adding an IconNodeWidget via Drag and Drop Functionality</h2>

<p>Earlier, we used the <tt>GraphSceneImpl</tt> class's constructor to pass a scene to the TopComponent's JScrollPane.
  So far, the scene exists but has no behavior. Behavior is added through actions.
   The action that we will look at in this section is called <tt><a href="http://graph.netbeans.org/documentation.html#AcceptAction">AcceptAction</a></tt>. This
    action enables drag and drop functionality. The drag and drop functionality could
     be applied to a widget, but here we apply it to the scene itself.
      
<p>We use <tt>createAcceptAction</tt> to specify what should happen
  when an item from the palette is dragged over the scene. Two methods are involved
   here. The first, <tt>isAcceptable()</tt>, is used to determine whether the
    item is acceptable to the scene. Here you can test the item, by using
     the transferable. You can also set the drag image, which is all that we
     do in the implementation below. If <tt>true</tt> is returned, the <tt>accept</tt>
      method is called. Here we get the image from the transferable, using the same
       helper method as before. Then we call the <tt>addNode</tt> method, instantiating
        a new <a href="http://graph.netbeans.org/documentation.html#IconNodeWidget">IconNodeWidget</a>
  and passing the image retrieved from the transferable.
        
        <p>All the code in this section is interrelated, and you will
 receive red error underlines in your code until all the methods below
 have been added, but we will try to add everything
         in some kind of logical order anyway!

<ol>
<li>First, add the <tt>createAcceptAction</tt>, with its two methods, to the <tt>GraphSceneImpl</tt> class's constructor:

<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>Note:</b> After you add the above code, some red underlines will remain, denoting that there are errors.
 These errors are because the code above refers to a method and a class that you have not yet created.
 You will create them in the next steps.

<p><li>Next, in the <tt>GraphSceneImpl</tt> class, add a helper method for retrieving the image from the transferable:

<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 ? (Image) o : Utilities.loadImage("org/netbeans/shapesample/palette/shape1.png");
}</pre>

<p>Note that you can define
 any kind of image when an image
is not successfully returned from this helper method. For now we will use the "<tt>shape1.png</tt>" image instead.</p>

<p><li>Create a new class called <tt>MyNode</tt>. This class represents a node in a graph-oriented model.
It cannot be an image directly, since each node has to be unique
(checked by "equals" method) in the model. If you would use the images
directly, then you would be able to have only 3 nodes (one for each
image) in the scene. Using the MyNode class, you can have multiple nodes and
each node can have its own or a shared image instance.

<pre class="examplecode">public class MyNode {
    
    private Image image;
    
    public MyNode(Image image) {
        this.image = image;
    }
    
    public Image getImage() {
        return image;
    }
}</pre>

<p><li>Change the signature of the <tt>GraphSceneImpl</tt> class to the following, so that the node is
 received by the Visual Library implementation class:</li>

<pre class="examplecode">extends GraphScene&lt;MyNode, String&gt;</pre>

<p>You must let the IDE generate new stubs for the abstract methods.
 
 <p>Also, since we are now using generics, make sure that the IDE is using JDK 1.5.
  If you are not sure whether 1.6 is being used, right-click the project, choose 
  Properties, and go to the Sources page. Change the
   Source Level drop-down to 1.5.

 <p><li>Finally, define the new widget in the <tt>GraphSceneImpl</tt> class. This method is called automatically by the <tt>accept</tt>
  method. Use it to define a Visual Library widget when the palette item is dropped.
 
<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>Notice that we set the image retrieved from the node. We also generate a random
 number so that we have a label. By default, the widget exists but has no behavior.
 Here, we create a move action, so that the widget can be moved in the scene. Finally,
 before returning the widget to the scene, we add it as a child to the LayerWidget that
 we created in the previous section.</p>

 <p><li>Reload the module and open the Shape window again.</p>

<p>Now you can drag and drop items from the palette. As you drag an item over the scene,
 you will see the drag image. When you drop an item, it becomes a widget and is visible
 within the scene as well as within the satellite view, as you can see here:

<p><img border="1" src="../../images/tutorials/vislib/finishedscene.png"/></p>

 
</ol>


<!-- ===================================================================================== -->
<p><h2><a name="adding-to-scene"></a>Adding Functionality to the Scene</h2>

<p>In the previous section, we added <tt><a href="http://graph.netbeans.org/documentation.html#AcceptAction">AcceptAction</a></tt>
 to the scene. We had to define two methods to specify whether the item should
  be dropped and for resolving the item. In this section, we use <tt><a href="http://graph.netbeans.org/documentation.html#ZoomAction">ZoomAction</a></tt>,
   to add zoom/unzoom functionality to the scene.

<ol>
    <li>At the end of the <tt>GraphSceneImpl</tt> class's constructor, add this line:
    
<pre class="examplecode">getActions().addAction(ActionFactory.createZoomAction());</pre>   
    
<p><li>Install the module again.

<p><li>While holding CTRL key use the mouse wheel to zoom in and out of the scene:</p>

<p><img border="1" src="../../images/tutorials/vislib/zoom.png"/></p>

<p><img border="1" src="../../images/tutorials/vislib/unzoom.png"/></p>

</ol>

<p><b>Note:</b> The shapes are rendered as images. SVG is currently not supported. 

<p>In the same way as described above, you can add Pan functionality to the scene,
 by means of this line:
 
 <pre class="examplecode">getActions().addAction(ActionFactory.createPanAction());</pre>
 
 <p>When you add this line, the user will be able to hold down the mouse wheel
  and then scroll in any direction in the scene.

<!-- ===================================================================================== -->
<p><h2><a name="adding-to-widget"></a>Adding Functionality to the IconNodeWidget</h2>

<p>Earlier we added <tt><a href="http://graph.netbeans.org/documentation.html#MoveAction">MoveAction</a></tt>
 to the IconNodeWidget, to enable move behavior for the widget. In the same way, a lot
  of other behavior can be added to the widget. In this section, we add
   <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>,
     and <tt><a href="http://graph.netbeans.org/documentation.html#InplaceEditorAction">InplaceEditorAction</a></tt>.

     <p>The <tt>InplaceEditorAction</tt> will let the user change the label:
   
  <p><img border="1" src="../../images/tutorials/vislib/editable.png"/></p>
  
  <p>The <tt>SelectAction</tt> will change the color of the label when the widget is selected,
   while the <tt>HoverAction</tt> will change the color of the label when the mouse hovers over the widget:
   
   <p><img border="1" src="../../images/tutorials/vislib/selectable-hoverable.png"/></p>
     
     
<ol>
    <p><li>First define the editor action that we will add to the IconNodeWidget:
    
<pre class="examplecode">private WidgetAction editorAction = ActionFactory.createInplaceEditorAction(new LabelTextFieldEditor());</pre>   
    
<p><li>Now define the <tt>LabelTextFieldEditor</tt>, as follows:

<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><li>Finally, assign the editor action to the IconNodeWidget, in the same way
 as done for the move action earlier:

<pre class="examplecode">widget.getLabelWidget().getActions().addAction(editorAction);</pre>   
 
<p>Here, we first get the IconNodeWidget's LabelWidget. Then we add the editor action
 to the LabelWidget.</p>

 <p><li>The IDE will prompt you to add several import statements. In each case,
  accept the suggestion offered by the IDE.

<p><li>Next, in the case of <tt>SelectAction</tt> and <tt>HoverAction</tt>, you need do
 nothing more than assign these actions to the IconNodeWidget:
 
<pre class="examplecode">widget.getActions().addAction(createSelectAction());
widget.getActions().addAction(createObjectHoverAction());</pre>

<p><li>Next, you need to think about the order of the actions that
 you have created. For details, see the <a href="http://graph.netbeans.org/documentation.html#OrderOfActions">Order of Actions</a>
  section in the documentation. After you have reordered
 the actions, the <tt>attachNodeWidget</tt> should look as follows:

<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><li>Install and try out the module again. As shown at the start of this section,
when you hover over a widget's label, or when you select it, its color will change. Also,
when you click on a label, you are able to edit its content.

</ol>

<p>Congratulations, you have completed the Visual Library 2.0 Tutorial for NetBeans 6.0.</p>

<br>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Visual%20Library%20API%20Tutorial%20NetBeans%206.0">Send Us Your Feedback</a></div>
<br style="clear:both;" />

      
        <a name="next_steps"></a><h2>Next Steps</h2>
        <p>For more information
        on working with the Visual Library API, see:</p> 
  
 <ul>
      <li><a href="http://www.javalobby.org/eps/netbeans_visual_library/">Roman Strobl's Visual Library
Screencast</a> on Javalobby.
     <li><a href="http://graph.netbeans.org/">Visual Library Project Page</a>
     <li><a href="http://graph.netbeans.org/documentation.html">Visual Library 2.0 - Documentation</a>
 </ul>
 

    </body>
</html>
