<!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 Platform Porting 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="gwielenga@netbeans.org">
    <meta name="indexed" content="y">
    <meta name="description"
          content="A short guide to porting a Swing application to the NetBeans PLatform.">
</head>
<body>
    <h1>NetBeans Platform Porting Tutorial</h1>
    
    <p>This tutorial demonstrates how to port a simple Swing application to the NetBeans Platform.
    Though the sample is simple, the basic concepts of "porting" an application to the NetBeans
    Platform will become clear. At the end, some general principles will be identified, based on the
    steps taken in the tutorial. Hopefully, they will be useful to you when porting your own 
    Swing applications to the NetBeans Platform.
     <p><strong class="notes">Note: </strong>This tutorial is out of date! The latest version of this tutorial
          <a href="https://platform.netbeans.org/tutorials/nbm-porting-basic.html">is found here</a>.</p>
    
    <p><b>Contents</b></p>
   
       <img  src="../images/articles/65/netbeans-stamp65.gif" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.5" title="Content on this page applies to NetBeans IDE 6.5"> </p>
      <ul class="toc">
        <li><a href="#intro">Introduction to Porting</a></li>
        <li><a href="#getting">Getting the Anagram Game</a></li>
        <li><a href="#compliance">Levels of Compliance</a></li>
        <ul>
                 <li><a href="#creating">Creating the Module Project Source Structure</a>
                 <li><a href="#porting0">Porting Level 0: Launchable</a>
                 <li><a href="#porting1">Porting Level 1: Integration</a>
                 <li><a href="#porting3">Porting Level 2: Use Case Support</a>
                 <li><a href="#porting4">Porting Level 3: Aligned</a>
        </ul>
      </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>
            <tr>
                <td class="tbltd1"><a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=2753">Download the Sample</a></td>
                <td class="tbltd1"></td>
            </tr>
        </tbody>
    </table>
    
    <h2 class="tutorial"><a name="intro"></a>Introduction to Porting</h2>
    
    <p>Before beginning this procedure, it makes sense to ask why one would want to do so in the
    first place. A typical Swing application consists of a user interface layer on top of a
    general framework. The general framework normally provides features dealing with an
    application's infrastructure, such
    as an application's menu bar, windowing system (also known as "docking system"), and 
    lifecycle management. Typically this framework is reused by many applications within the
    same company. The NetBeans Platform exists specifically to cater to these infrastructural
    concerns. You do not need to create these on your own for your own Swing applications. You
    can simply move the useful parts of your own application to the NetBeans Platform and then,
    from that point onwards, the NetBeans Platform will be the new underlying 'plumbing' layer
    of your application. You can then focus on the more interesting parts of your application,
    specifically, the user interface. This will speed up your development process and give you
    a consistent basis for all your applications.
    
    <p>In this tutorial, we will begin with the Anagram Game, which is a standard Swing application
    sample that is distributed with NetBeans IDE. We will, step by step, move it to the NetBeans
    Platform and then see the advantages and disadvantages of doing so.
    
    <!-- ===================================================================================== -->

    <h2 class="tutorial"><a name="getting"></a>Getting the Anagram Game</h2>
    
    <p>We begin by getting the Anagram Game, which is one of the IDE's standard Java samples,
    from the New Project wizard. Then we run it and analyze its parts.
    
    <ol>
        <li>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select Samples &gt; Java. Under Projects, 
        select Anagram Game. Click Next and Finish.
        <p><p>You should now see the Anagram Game application outlined in the Projects window, as shown here:
        
        <p><p><img border="1" src="../images/tutorials/porting/ag0.png"/>
        
        <p>The application contains the following classes:
        
        <ul>
            <li><b><tt>WordLibrary.java</tt></b>. Provides a list of scrambled words, as well
            as their unscrambled equivalents, together with getters and setters for accessing them.</li>
            <li><b><tt>About.java</tt></b>. Provides the About box, accessed from the File menu.</li>
            <li><b><tt>Anagrams.java</tt></b>. Provides the main user interface of the application,
                principally consisting of a <tt>JPanel</tt> containing labels and text fields. Also included
            is a menu bar containing a File menu, with the menu items 'About' and 'Exit'.</li>
        </ul>
        
        <p><li>Run the application and you should see the following:
        
        <p><p><img border="1" src="../images/tutorials/porting/ag1.png"/>
        
        <p><li>When you specify the correctly unscrambled word, you will see this:
        
        <p><p><img border="1" src="../images/tutorials/porting/ag2.png"/>
        
    </ol>
    <p>Before porting this application to the NetBeans Platform, we need to think
    about <i>the stages in which we want to port our application</i>. In other
    words, you do not need to port everything at once. And there are different
    levels to which you can integrate your application, from a mostly superfical
    level to a level that aligns your application completely with the paradigms
    and purposes of the NetBeans Platform. The next section will show the levels
    of compliance your application can have with the NetBeans Platform.
    <br />
   
     <!-- ===================================================================================== -->
    <h2 class="tutorial"><a name="compliance"></a>Levels of Compliance</h2>
    
<p>Converting an application to be fit for a framework such as the NetBeans Platform can be done 
 on various levels. The integration can be shallow and use just a few integration points or
 it can be deeper, tightly following the paradigms of the NetBeans Platform. 
 
 <p>The stages can be described as follows:

 
 <h4 id="section-LevelsOfCompliance-Level0Launchable">Level 0: Launchable</h4>
<p>One or more of the following can be done to make your application launchable with as
 few changes as possible:
<ul>
    <li>Enhance your manifest with NetBeans key/value pairs so that your JAR is recognized as a
    NetBeans module.
    <li>Use dependencies between modules. With instances of plain Class-Path you can set dependencies 
    between modules.
    <li>Register a menu item. Simply register a menu item in the declarative
    layer file (<tt>layer.xml</tt>) of your module, to 
    invoke your original application. This file is created automatically when you create a new
     module project in NetBeans IDE, as you will see later.
</ul>
<p>In this tutorial, we will do all of the above. We will enhance the manifest, which the module
project wizard will do for us. We will create a menu item that will
 invoke our application. To do so, we will move our application's classes into a module source
 structure. Then we will use the New Action wizard to create a new menu item, which will
 automatically be registered for us, and a dependency will be set on the Utilities API, which
 we will need to implement the Action. From that action, we will invoke our application.

<h4 id="section-LevelsOfCompliance-Level1Integrated">Level 1: Integrated</h4>
<p>Here are some pointers for integrating the application more
 tightly with the NetBeans Platform:
<ul>
    <li>Integrate visually to get the benefits of the NetBeans Window System, which is
    also known as a docking framework.
    <li>Use NetBeans Dialog APIs, primarily the <tt>TopComponent</tt> class and the
    <tt>DialogDisplayer</tt> class.
    <li>Change initialization code of your application, use the <tt>ModuleInstall</tt>
    class or declarative registrations, through the layer file or the META-INF/services folder.
</ul>
<p>In this tutorial, we will first create a <tt>JPanel</tt> and move the relevant <tt>JPanel</tt>
from the <tt>JFrame</tt> to the new <tt>JPanel</tt>. We will use a <tt>DialogDisplayer</tt>, from
within our action, to call the <tt>JPanel</tt>. The <tt>DialogDisplayer</tt> integrates nicely with
the NetBeans Platform, unlike a <tt>JFrame</tt> or a <tt>JPanel</tt>. For example, the 
<tt>DialogDisplayer</tt> is modal and it works well with the IDE's integrated JavaHelp. 
Next, we will move the <tt>JPanel</tt> to a <tt>TopComponent</tt>. The <tt>TopComponent</tt> class
creates a window on the NetBeans Platform, which in our case will show our <tt>JPanel</tt>.


<h4 id="section-LevelsOfCompliance-Level2UseCaseSupport">Level 2: Use Case Support</h4>
<p>This level of compliance with the NetBeans Platform is concerned with one or more of the following activities:
<ul>
    <li>Bind your application to other modules by inspecting existing functionality and trying to use it.
    <li>Simplify the workflow to fit into the NetBeans Platform paradigms.
    <li>Listen to the global selection to discover what other modules are doing and update your state accordingly.
</ul>
<p>In this tutorial, we will listen for the existence of <tt>EditorCookies</tt>, using the following statement:

<pre>EditorCookie ec = activatedNodes[0].getLookup().lookup(EditorCookie.class);</pre>
<p>A cookie is a <i>capability</i> and cookies are a powerful feature of NetBeans.  
With a Java interface, your object's capabilities are fixed at compile time, while NetBeans cookies
allow your object to behave dynamically because your object can expose capabilities, or
not, based on its state. An <tt>EditorCookie</tt>
 defines an editor, with interfaces for common activities such as opening a document, closing the editor,
 background loading of files, document saving, and modification notifications. We will listen for the
 existence of such a cookie and then we will pass the content of the editor to the <tt>TopComponent</tt>, in the
 form of words. By doing this, we are doing what the first item above outlines, i.e., inspecting existing
 functionality and reusing it within the context of our ported application. This is a modest level of integration. 
 However, it pays off because you are reusing functionality provided by the NetBeans Platform.
    
<h4 id="section-LevelsOfCompliance-Level3Aligned">Level 3: Aligned</h4>
<p>In this final stage of your porting activity, you are concerned with the following thoughts, first and foremost:
    <ul>
        <li>Become a good citizen of the NetBeans Platform, by exposing your own state to other modules so that they know what you are doing.
        <li>Eliminate duplicated functionality, by
        reusing the Navigator, Favorites window, Task List, Progress API, etc., instead of creating or maintaining your own.
        <li>Cooperate with other modules and adapt your application to the NetBeans Platform way of doing things.
    </ul>
    <p>Towards the end of this tutorial, we will adopt this level of compliance by letting our <tt>TopComponent</tt>
    expose a <tt>SaveCookie</tt> when changes are made to the "Guessed Word" text field. By doing this, we will 
    enable the Save menu item under the Tools menu. This kind of integration brings the full benefits of the
NetBeans Platform, however it also requires some effort to attain.
   
    
    
    <!-- ===================================================================================== -->

    <h2 class="tutorial"><a name="creating"></a>Creating the Module Project Source Structure</h2>
    
    <p>First, let's create the source structure of our module. We use a wizard to do so. This
    is the typical first step of creating a new module for a NetBeans Platform application.
    
    <ol>
        <li>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select NetBeans Modules. Under Projects, 
        select Module, as shown below:</li>
        
        <p><p><img border="1" src="../images/tutorials/porting/agp1.png"/>
        
        <p>Click Next.
        
        <p><li>Type <tt>AnagramGamePlugin</tt> in Project Name and choose somewhere
        to store the module, as shown below:
        
        <p><p><img border="1" src="../images/tutorials/porting/agp2.png"/>
        
        <p>Click Next.
        
        <p><li>Type a unique name in the Code Name Base field,
        which provides the unique identifier for your module.
        It could be anything, but here it is <tt>org.netbeans.modules.anagramgameplugin</tt>.</p>
        <p>Also make sure to fill in the XML Layer field, which specifies the location
        and name of the module's configuration file. By default, the field is empty
        because not all NetBeans modules need a configuration file. In this case, you will
        need one, so fill out the field as shown below:
        
        <p><p><img border="1" src="../images/tutorials/porting/agp3.png"/>
        
        <p><li>Click Finish.
        
        <p><p><p>Below the Anagram Game sample, you should now see the source structure of your
        new module, as shown here:
        
        <p><p><img border="1" src="../images/tutorials/porting/agp4.png"/>
        
        
    </ol><p>Above, we can see that we now have the original application, 
    together with the module to which it
    will be ported. In the next sections, we will begin porting the application to
    the module, using the porting levels described earlier.
    <br />
    
     <!-- ===================================================================================== -->
    <h2 class="tutorial"><a name="porting0"></a>Porting Level 0: Launchable</h2>
    
    
    <p>At this stage, we simply want to be able to launch our application from
a module. Here we will create a menu item that invokes the application. We begin
by copying the application's sources into the module source structure.</p>
    <ol>
        <li>Copy the two packages from the Anagram Game into the module. Below,
        the new packages and classes in the module are highlighted:</li>
        <p><p><img border="1" src="../images/tutorials/porting/agport0.png"/>
   
        <li>Use the New Action Wizard to create a new menu item. To do
        so, right-click the module project, choose New &gt; Other and
        then Module Development &gt; Action. Click Next and then
        specify that you want a menu item that will always be enabled.
        
         <li>Click Next and specify the location of the menu item that
         will invoke the application. Here, the Window menu
         is chosen, but it could be any menu at all and it could be between
         any menu item within the menu:
         <p><p><img border="1" src="../images/tutorials/porting/agport2.png"/>
         <p><b>Note:</b> The screenshot of the wizard step above is truncated to save space
         in this tutorial.
         <li>In the final step of the wizard, specify a name, display
         name, and package for the action. These could, again, be anything,
         but the screenshot below shows the values used in this tutorial:
         <p><p><img border="1" src="../images/tutorials/porting/agport3.png"/>
   
        <li>Click Finish and the new Java class is added, together with new registration
            entries in the configuration file, <tt>layer.xml</tt>.
        <li>Next, modify the action, so that we can
        invoke the <tt>JFrame</tt> from the menu item. To do so, copy the 
        content of the <tt>main</tt> method from the <tt>Anagrams</tt>
        class to the <tt>performAction</tt> in the action:
   
   <p><pre>public void performAction() {
    new Anagrams().setVisible(true);
}</pre>
    
    </li>
    
       <p><li>Right-click the module in the Projects
        window and choose Install/Reload in Development IDE
        or Install/Reload in Target Platform. Depending
        on which of these you choose, the module will
        either be installed in the current IDE or in a 
        new instance of the IDE that automatically starts
        up.
        
        <li>Under the Window menu, or whichever menu you specified earlier,
        you should find the menu item
         that you created. Choose it and your application appears.
    
    
    </ol>   
    
    <p>The application is displayed, but note that it is not
    well integrated with the NetBeans Platform. For example,
    it is not modal. In the next section, we will integrate
    it more tightly with the NetBeans Platform.
    
    <br />
    
    <!-- ===================================================================================== -->

    <h2 class="tutorial"><a name="porting1"></a>Porting Level 1: Integration</h2>
    
    <p>In this section, we integrate the application
    more tightly by creating a new window, so that we have a user 
    interface, i.e., 
    a window, to which we can move those contents of
    the <tt>JFrame</tt> that are useful to our new application.
    
    <ol>
        <li>Right-click the AnagramGamePlugin in the Projects window and then
        choose New &gt; Other. Under Categories, select Module Development. Under File Types, 
        select Window Component. Click Next.
        
        <p><li>Choose the position where you would
        like the window to appear. For purposes of this
        tutorial choose "editor", which will place the
        Anagram game in the main part of the application.
        Optionally, specify whether the window should
        open automatically when the application starts up.
        Click Next.
        
        <p><li>Type <tt>Anagram</tt> in Class Name
        Prefix and select <tt>org.netbeans.modules.anagramgameplugin</tt>
        in Package, as shown here:
        
        <p><p><img border="1" src="../images/tutorials/porting/agf2.png"/>
        
        <p>Above, notice that the IDE shows the files it
        will create and modify.
        
        <p><li>Click Finish.
        <p><p>Now you have a set of new Java and XML source
        files, as shown here:
        
        <p><p><img border="1" src="../images/tutorials/porting/agf3.png"/>
        
        <p><li>Open the <tt>Anagrams</tt> class in
        the Anagram sample, as well as the
        <tt>AnagramTopComponent</tt>, which was created
        in the previous step.
        <p><p>When you click the mouse in the
        Anagram class, notice that the labels and
        text fields are in a Swing container, in
        this case a <tt>JPanel</tt>, as shown here:
        
        <p><p><img border="1" src="../images/tutorials/porting/agf4.png"/>
        
        <p><b>Tip:</b> If the Swing components were not within a container,
        you could select them all with the mouse, then right-click and
        choose Enclose In, to let the IDE create a container within which
        all the selected components would be enclosed.
        
        <p><li>Right-click the <tt>JPanel</tt> and copy it.
        Paste it in the TopComponent and you should see
        the old user interface in your new plugin:
        
        <p><p><img border="1" src="../images/tutorials/porting/agf5.png"/>
        
        <p><li>Only one thing needs to be transferred, at
        this point: the variable declared in the original
        <tt>JFrame</tt>. Open the <tt>JFrame</tt> and copy
        the variable:
        
        <p><p><img border="1" src="../images/tutorials/porting/agf6.png"/>
        
        <p>Paste it into the source view of the
        TopComponent:
        
        <p><p><img border="1" src="../images/tutorials/porting/agf7.png"/>
        
        <p><li>Right-click the module in the Projects
        window and choose Install/Reload in Development IDE
        or Install/Reload in Target Platform. Depending
        on which of these you choose the module will
        either be installed in the current IDE or in a 
        new instance of the IDE that automatically starts
        up.
        
        <p><p>You should now see the Anagram Game window, which
        you defined in this section. You will also find
        a new menu item that opens the window, under the
        Window menu.</p>
        
        <p>Also notice that the game works as before. You
        need to click New Word once, to have the module
        call up a new word, and then you can use it as
        before:</p>
        <p><p><img border="1" src="../images/tutorials/porting/agf8.png"/>
       
    </ol><p>
    <br />
    
    
    
     <!-- ===================================================================================== -->
    <h2 class="tutorial"><a name="porting3"></a>Porting Level 2: Use Case Support</h2>
    
    
    <p>In this section, we are concerned with listening to the global selection and making use 
 of data we find there.The global selection, also called the default lookup, is the registry for 
 global singletons and instances of objects which have been registered in the system by modules.
    Here we query the lookup for <tt>EditorCookies</tt> and make use of the <tt>EditorCookie</tt>'s
    document to fill the string array that defines the scrambled words displayed in the <tt>TopComponent</tt>. </p>
    <ol>
        <li>We begin by tweaking the <tt>WordLibrary</tt> class. We do this so that
        we can set its list of words externally. The sample provides a hardcoded list,
    but we want to be able to set that list ourselves, via an external action. Therefore,
    add this method to <tt>WordLibrary</tt>:
    
<p><pre>public static void setScrambledWordList(String[] inScrambledWordList) {
        SCRAMBLED_WORD_LIST = inScrambledWordList;
}</pre>    
    
<p>Next, we will create an action that will obtain the content of a Java class,
    break the content down into words, and fill the <tt>SCRAMBLED_WORD_LIST</tt> string array
    with these words. 

    </li>
    

    <li>Right-click the project node in the Projects window, choose New &gt; Action,
    and then choose "Conditionally Enabled" in the first panel of the New Action wizard.
    Select "EditorCookie" in the Cookie Classes drop-down list, because we want the action
    to be sensitive to EditorCookies. This means that
    the action will act on this type of Cookie and only be enabled when
    one is available from the current selection. Click Next.
    
    <li>Unselect "Global Menu Item". Select "Editor Context Menu Item". In the "Content Type"
    drop-down list, choose "text/x-java". Click Next, give the action a prefix and display name,
    then click Finish.
    
    <li>In the Source Editor, redefine the <tt>performAction</tt> as follows:
    
<p><pre>protected void performAction(Node[] activatedNodes) {
    try {
    
        <b>//Look up the EditorCookie for the current node:</b>
        EditorCookie ec = activatedNodes[0].getLookup().lookup(EditorCookie.class);
        
        <b>//Get the EditorCookie's document:</b>
        StyledDocument doc = ec.getDocument();
        
        <b>//Get the complete textual content:</b>
        String all = doc.getText(0, doc.getLength());
        
        <b>//Make words from the content:</b>
        String[] tokens = all.split(" ");
        
        <b>//Pass the words to the WordLibrary class:</b>
        WordLibrary.setScrambledWordList(tokens);
        
        <b>//Open the TopComponent:</b>
        TopComponent win = AnagramTopComponent.findInstance();
        win.open();
        win.requestActive();
        
    } catch (BadLocationException ex) {
        Exceptions.printStackTrace(ex);
    }
}</pre>    
    
<li>Install the module, right-click in the Java editor, and choose the new menu item
 you see there. The TopComponent opens. When you click to the next word, the words
 from the Java class appear in the Scrambled Word text field.
    
    </ol>   
    
<p>The result of this exercise is that you now see the content of the Java class in the Scrambled Word text field.
 Of course, these words are not really scrambled and you cannot really unscramble them. However, your module is
 making use of the content of files supported by a different module altogether, and it is updating its state
 accordingly.
    
    <br />
    
    
     <!-- ===================================================================================== -->
    <h2 class="tutorial"><a name="porting4"></a>Porting Level 3: Aligned</h2>
    
    
    <p>In this section, we are concerned with becoming a "good citizen" of the
 NetBeans Platform. We are going to expose the state of the TopComponent to
 the other modules, so that we can cooperate with them. As an example of this, we
    will modify the TopComponent to offer a <tt>SaveCookie</tt>, which gives
    the user a way to store the text typed in the text field. By offering the
    <tt>SaveCookie</tt> when changes are made in the text field, the Save button
 and the Save menu item under the File menu will become enabled. When the user
 selects the button or menu item, a dialog will be displayed and the button
 and menu item will become disabled, until the next time that a change is made
 to the text field.</p>
    <ol>
        
    <li>Begin by setting a dependency on the Dialogs API, by right-clicking
    the project node in the Projects window, choosing Properties, and
    then adding the Dialogs API and the Nodes API in the Libraries panel.
        
    <li>Next, we need to create a node within our <tt>TopComponent</tt>. We need to do so because
        we need the <tt>TopComponent</tt> to expose a <tt>SaveCookie</tt>, i.e., the capability to save.
        Such capabilities apply to nodes and therefore we need to create a node, add an implementation
        of <tt>SaveCookie</tt> to its set of cookies, and then set the node as
        the <tt>TopComponent's</tt> activated node. Here is the node, with comments inline to explain
        what it is for:
    
<p><pre>private class DummyNode extends AbstractNode {

    SaveCookieImpl impl;

    public DummyNode() {
        super(Children.LEAF);
        impl = new SaveCookieImpl();
    }

    <b>//We will call this method, i.e., dummyNode.fire(),
    //from a document listener set on the text field:</b>
    public void fire(boolean modified) {
        if (modified) {
            <b>//If the text is modified,
            //we add the SaveCookie implementation to the cookieset:</b>
            getCookieSet().assign(SaveCookie.class, impl);
        } else {
            <b>//Otherwise, we make no assignment
            //and the SaveCookie is not made available:</b>
            getCookieSet().assign(SaveCookie.class);
        }
    }

    private class SaveCookieImpl implements SaveCookie {

        public void save() throws IOException {

            Confirmation msg = new NotifyDescriptor.Confirmation("Do you want to save \"" + 
                guessedWord.getText() + "\"?", NotifyDescriptor.OK_CANCEL_OPTION, 
                NotifyDescriptor.QUESTION_MESSAGE);

            Object result = DialogDisplayer.getDefault().notify(msg);

            <b>//When user clicks "Yes", indicating they really want to save,
            //we need to disable the Save button and Save menu item,
            //so that it will only be usable when the next change is made
            //to the text field:</b>
            if (NotifyDescriptor.YES_OPTION.equals(result)) {
                fire(false);
                <b>//Implement your save functionality here.</b>
            }

        }
    }
}</pre>    
    
    </li>
    
<p>Declare the <tt>DummyNode</tt> at the top of the class:
    
 <p><pre>private DummyNode dummyNode;</pre>    
    
<p><li>Next, in the TopComponent's constructor, we set the activated node:

<p><pre>setActivatedNodes(new Node[]{dummyNode = new DummyNode()});</pre>

<li>Finally, we listen for change on the text field's document,
 and fire change events whenever the text field's document changes, by
 adding this document listener code to the end of the <tt>TopComponent</tt>'s
 constructor:

<p><pre>guessedWord.getDocument().addDocumentListener(new DocumentListener() {

    public void insertUpdate(DocumentEvent arg0) {
        dummyNode.fire(true);
    }

    public void removeUpdate(DocumentEvent arg0) {
        dummyNode.fire(true);
    }

    public void changedUpdate(DocumentEvent arg0) {
        dummyNode.fire(true);
    }
    
});</pre>

<li>By default, you have a Save menu item under the File menu, but no Save button
 in the toolbar. For testing purposes, you may want a Save button in the toolbar.
 For this purpose, add the following to the layer:

<p><pre>&lt;folder name="Toolbars"&gt;
    &lt;folder name="File"&gt;
        &lt;file name="org-openide-actions-SaveAction.instance"/&gt;
    &lt;/folder&gt;
&lt;/folder&gt;</pre>

<li>Install the module, make a change in the "Guessed Word" text field, and notice that the Save button
 and the Save menu item become enabled. Select either the button or the menu item, click Yes in the
 dialog, and notice that the Save functionality is disabled.
    
    
    </ol>   
    <br />
    
    <p>Congratulations! Now that your module is making use of existing functionality, you have taken one step
    in successfully aligning it with the NetBeans Platform. Other modules can be now be
    plugged into the NetBeans Platform to take advantage of, or even extend, features added by your
    module.  Hence, not only can your module benefit from what the NetBeans Platform provides, 
    but you've created something that other modules can use as well.
    
    <p>You need to continue finding ways
    to further align your original application with the functionality offered by the NetBeans Platform,
    in order to make it even more of a good "good citizen" and useful member of the community of modules
    within the application. 
    
<p>For example, you can write a new node, with child nodes for each
 word defined in the class:

<pre>public class WordListNode extends AbstractNode {

    private int index;
    private final WordLibrary wordLibrary;

    public WordListNode() {
        this(WordLibrary.getDefault());
    }
    
    private WordListNode(WordLibrary w) {
        super(new WordListChildren(w));
        wordLibrary = w;
    }
    
    WordListNode(int index, WordLibrary w) {
        super(Children.LEAF);
        this.index = index;
        this.wordLibrary = w;
        
        setName("Index: " + index);
        setDisplayName(wordLibrary.getWord(index));
    }

    @Override
    public String getHtmlDisplayName() {
        return "&lt;b&gt;" + wordLibrary.getWord(index) + "&lt;/b&gt; (&lt;i&gt;" + wordLibrary.getScrambledWord(index) + "&lt;/i&gt;)";
    }
    
    private static class WordListChildren extends Children.Keys&lt;Integer&gt; {
        private final WordLibrary wordLibrary;

        public WordListChildren(WordLibrary wordLibrary) {
            this.wordLibrary = wordLibrary;
        }
        
        @Override
        protected void addNotify() {
            List&lt;Integer&gt; arr = new ArrayList&lt;Integer&gt;();
            for (int i = 0; i &lt; wordLibrary.getSize(); i++) {
                arr.add(i);
            }
            setKeys(arr);
        }

        @Override
        protected void removeNotify() {
            setKeys(Collections.&lt;Integer&gt;emptyList());
        }
        
        @Override
        protected Node[] createNodes(Integer index) {
            WordListNode node = new WordListNode(index, wordLibrary);
            return new Node[] { node };
        }
    }
    
}</pre>
    
    <p>In return, the lifecycle of the original application is now handled by the NetBeans Platform
    and you can leverage as much of the existing modules' functionality as is reasonable for your module. In fact, 
    your original application is now no longer an application, but an integral part of a larger application.
    
    <!-- ===================================================================================== -->

    <h2 class="tutorial"><a name="next-steps"></a>Next Steps</h2>
    
    <p>There are several next steps one can take at this point, aside from further aligning
     the module with the NetBeans Platform, as outlined above:
    
    <ul>
        <li><b>Become aware of the differences between standard Swing applications
        and the NetBeans Platform.</b> For the most part, the standard Swing approach to
        creating a user interface will continue to work for your NetBeans Platform
        application. However, the NetBeans Platform approach is better, easier, or both
        in some cases.  One example is that of the NetBeans Dialogs API.  The standard Swing approach,
        via, for example, the <tt>JOptionsPane</tt>, works OK, but using the NetBeans Dialogs API is easier,
        because it automatically centers your dialog in the application and allows you to dismiss it
        with the ESC key.  Using the Dialogs API also lets you plug in a different DialogDisplayer, 
        which can make it easier to customize or test your application.
        
        <p>Below is a list of the principle differences between the typical Swing approach
        and that of the NetBeans Platform:
        
        <ul>
            <li>Loading of images
            <li>Loading of resource bundles and localized string
            <li>Assigning of mnemonics to labels and buttons
            <li>Showing dialogs
        </ul>
        <p>For details on all of the above items, read 
        this FAQ: <a href="http://wiki.netbeans.org/wiki/view/DevFaqNbIdeosyncracies">Common calls that should be done slightly differently in NetBeans than standard Swing apps (loading images, localized strings, showing dialogs)</a>.
   
        <p>In addition, note that, since the NetBeans Platform now handles the lifecycle of your module, since it is
        now part of the whole application, you can no longer use <tt>System.exit</tt>. Instead, you need to use <tt>LifecycleManager</tt>. To
        run code on start up, which should only be done when absolutely necessary, you need to use the NetBeans <tt>ModuleInstall</tt> class and,
        specifically, its <tt>restored</tt> method. A useful reference in this context is <a href="http://www.ociweb.com/jnb/jnbOct2005.html#porting">Porting a Java Swing Application to the NetBeans Platform</a>,
        by Tom Wheeler, in <a href="http://www.ociweb.com/jnb/jnbOct2005.html#porting">Building A Complete NetBeans Platform Application</a>.
        
        <li><b>Create a module project for each distinct part of your application.</b> The
        NetBeans Platform provides a modular architecture out of the box. Break your
        application into one or more modules. Doing so requires some analysis of your
        original application and an assessment of which parts could best fit within
        a new module and how to communicate between them. Since the example in this
        tutorial was simple, we only needed one module. A next step might be to put the
        <tt>WordLibrary</tt> class in a separate module and expose it as a public API.
        Doing so would let other modules
        provide user interfaces on top of the API provided by the first module, as shown here:
        <p><p><img border="1" src="../images/tutorials/porting/agf9.png"/>
        <p>As shown above, you need to put the modules in a module suite. Then set
        a dependency in the plugin module on the API module, using the Libraries
        panel in the plugin module's Project Properties dialog box. The size of each module, i.e.,
        when one should create a new module or continue developing within an existing one, is a
        question of debate. Smaller is better, in general.
        
        <li><b>Always keep reevaluating what you really need to port.</b> Look at the NetBeans Platform and
        decide where there is overlap with your own application. Where there is overlap,
        such as the menu bar and About box, decide what you want to do. Typically, you
        want to leverage as much as possible from the NetBeans Platform. Therefore, you
        would port as little as possible from your own application, while keeping as much
        of it as is useful to you.
        
        <li><b>Move distinct parts of your user interface to one or more TopComponents.</b> On the NetBeans
        Platform, the <tt>TopComponent</tt> class provides the top level Swing container. In effect,
        it is a window. Move the user interface from your original application to one or
        more of these windows and discard your original <tt>JFrame</tt>s.
        <li><b>Copy the Java classes that do not provide user interface elements.</b> We simply
        copied the original <tt>WordLibrary.java</tt> class. You can do the same with the model
        of your own Swing applications. You might need to tweak some code to smoothen the transition
        between the old Swing application and the new NetBeans Platform application, but (as 
        in the case shown in this tutorial) this might not even be necessary.
        
    </ul>
    
    <br />
    
    </div>
    
    
    <br>
    <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Swing%20Porting%20Tutorial">Send Us Your Feedback</a></div>
    <br style="clear:both;" />
    <!-- ======================================================================================== -->
    
    <h2><a name="nextsteps"></a>Next Steps</h2>
    
    <p>For more information about creating and developing NetBeans modules, see the following resources: 
    <ul>
        <p><li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li>
        <p><li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API Javadoc</a></li>
    </ul>
    
    <hr>
    <!-- ======================================================================================== -->
    
    
</body>
</html>
