<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>NetBeans Platform Quick Start for NetBeans Platform 6.8</title>
    <meta name="AUDIENCE" content="NBUSER"/>
    <meta name="TYPE" content="ARTICLE"/>
    <meta name="EXPIRES" content="N"/>
    <meta name="developer" content="gwielenga@netbeans.org"/>
    <meta name="indexed" content="y"/>
    <meta name="description"
          content="A short guide to getting started with the NetBeans Platform."/>
       <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
</head>
<body>
	<style>
	.examplecode {
	background-color:#FFF8E4;
	overflow:auto;
	width:550px;
	white-space:pre;
	}
	</style>
   <h1>NetBeans Platform Quick Start</h1>

   <p>Welcome to the <a href="https://platform.netbeans.org/"><b>NetBeans Platform</b></a>!</p>

   <p>The key benefit of the NetBeans Platform is its modular architecture. Secondary
    benefits are the NetBeans Platform's reliance on the Swing UI toolkit, which is the
    official toolkit for creating user interfaces in Java, in combination with the
    NetBeans IDE's award winning "Matisse" GUI Builder.</p>
   
   <p>In this quick start, you are introduced to the benefit and usage of modularity via
    a very simple example, contributed by Thomas W&#252;rthinger, who is currently a
    PhD student at the Johannes Kepler University in Linz, Austria. Once you have
    grasped the concepts introduced in this quick start, you will be ready to
    step onto the <a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a>,
    providing a very rich variety of tutorials for many different scenarios
    relating to the NetBeans Platform.</p>

<p class="tips"> If you are new to the NetBeans Platform, it is highly
 recommended to watch the screencast series <a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">Top 10 NetBeans APIs</a>.</p>

   <p><b>Contents</b></p>
   <p><img  src="https://platform.netbeans.org/images/articles/69/netbeans-stamp69.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.5, 6.7, 6.8" title="Content on this page applies to NetBeans IDE 6.5, 6.7, 6.8"/></p>
      <ul class="toc">
        <li><a href="#single">A Single Module NetBeans Platform Application</a></li>
        <li><a href="#lookup">A Modular Application Using Lookup</a></li>
        <li><a href="#listener">LookupListener and InstanceContent</a></li>
      </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"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
                <td class="tbltd1">version 6.7 or above</td>
            </tr>
            <tr>
                <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
                <td class="tbltd1">Version 6 or<br/>version 5</td>
            </tr>
        </tbody>
    </table>
 
    <p><b class="notes">Note:</b> Even though it is a separate product, there is no 
    need to download the NetBeans Platform separately. Typically, you develop the
    application in NetBeans IDE and then exclude the modules that are specific to
    the IDE but that are superfluous to your application.</p>
    
    <!-- ===================================================================================== -->
 
    <h2 class="tutorial"><a name="single"></a>A Single Module NetBeans Platform Application</h2>
    
    <p>We start by simply creating a new NetBeans Platform application,
        containing a single module.</p>
                
    <ol>

         <li>Choose File | New Project and then choose NetBeans Modules.
          Select "NetBeans Platform Application". You should see this:
          <p><img src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp01.png" alt="Fig 1"/></p>
          <p>Click Next.</p></li>
         
         <li>Call your new application "WordApp" and make it the IDE's main project:
         <p><img src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp02.png" alt="Fig 2"/></p>
         <p class="tips"> The IDE's main project is started when the 
         global project command "Run Project" is invoked.</p>
         <p>Click Finish.</p></li>

         <li>Expand the new application in the Projects window,
         right-click the Modules node, and choose "Add New". Call the new
         module "WordEngine":
         <p><img alt="create new module" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp03.png"/></p>
              <p>Click Next.</p></li>

         <li>Specify a unique name for the module, which is its code name
          base, as well as a name that will be displayed in the Projects window:
          <p><img alt="specify a name" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp04.png"/></p>
          <p>Click Finish. The new module is created and its structure is
          shown in the Projects window.</p></li>

         <li>Right-click the "WordEngine" module and choose New | Other.
         In the Module Development category, select "Window Component":
         <p><img alt="create new window" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp05.png"/></p>

         <p>Click Next. You should now see this:</p>
         <p><img alt="create new window" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp06.png"/></p>
         <p>Click Next.</p></li>

         <li>Set the class name prefix to "Text" and the package to "org.demo.wordengine":
         <p><img alt="set definitions" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp07.png"/></p>
         <p>Click Finish. The new window is added to the source structure
             of your module, together with some ancillary XML files.</p></li>

         <li>Now double click on the file "TextTopComponent.java" to open
         it in the Design view of the "Matisse" GUI Builder. Use the Palette (Ctrl-Shift-8) to
         drag and drop a button and a text area onto the window:

         <p><img alt="palette" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp15.png"/></p>

         <p>Right-click the text area, choose "Change Variable Name", and then
          name it "text". That is the name that will enable you to access the
          component from your code. Set the text of the button to "Filter!"</p></li>
          
         <li>Double click on the button, causing an event handling method
         to automatically be created in the Source editor. The method is called whenever the button is clicked. Change the body
         of the method to the following code.
<pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
   String s = text.getText();
   s = s.toUpperCase();
   text.setText(s);
}</pre></li>

         <li>Right-click the application and choose Run. Doing so will start up your
         new NetBeans Platform application and install your module. Your new application
         should look as follows:
         <p><img alt="show new app" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp08.png"/></p></li>

         <li>Choose Window | Text, enter a text in the text area, and click "Filter!".
         You should see that the text is now shown in uppercase:
         <p><img alt="uppercase" src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp09.png"/></p></li>

    </ol>

<p>You have learned how to create a new NetBeans Platform application and how
    to add new modules to it.</p>

    <!-- ===================================================================================== -->

    <h2 class="tutorial"><a name="lookup"></a>A Modular Application Using Lookup</h2>

    <p>We create two additional modules. The first new module
     defines a service, which the second module provides to
     the module we defined in the previous section.</p>

    <ol>
         <li>Expand the new application in the Projects window,
         right-click the Modules node, and choose "Add New". Call the new
         module "TextFilter", with code name base "org.demo.textfilter",
         complete the wizard, which adds the module to your previously created
         application, as you did in the previous section.</li>

         <li>Right-click the "TextFilter" module and choose
         New | Java Interface. Name the Java interface "TextFilter",
         in the package "org.demo.textfilter", and use the editor
         to define it as follows:

<pre class="examplecode">package org.demo.textfilter;

public interface TextFilter {

    String process(String s);

}
    </pre></li>

         <li>Right-click the "TextFilter" module,
         choose Properties, and use the "API Versioning"
         tab so specify that the package containing the
         interface should be available throughout the
         application:

    <p><img src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp10.png"/></p></li>

         <li>Create a third module in your application,
         name it "MyFilter", with "org.demo.myfilter" as the
         code name base.</li>

         <li>Add a dependency in the
         Project Properties dialog of the newly created
         "MyFilter" module
         to the "TextFilter" module:

         <p><img src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp11.png"/></p></li>

        <li>In the same way as shown in the previous step,
            set a dependency on the Lookup API module, which provides the
         ServiceProvider annotation that you will use in the next step.</li>

         <li>Because of the dependency you defined above,
         you can now implement the
         interface defined in the second module:

<pre class="examplecode">package org.demo.myfilter;

import org.demo.textfilter.TextFilter;

@ServiceProvider(service=TextFilter.class)
public class UpperCaseFilter implements TextFilter {

    public String process(String s) {
        return s.toUpperCase();
    }

}</pre>
<p class="tips"> At compile time, the @ServiceProvider annotation will create a META-INF/services
         folder with a file that registers your implementation of the
         TextFilter interface, following the JDK 6 ServiceLoader mechanism.</p></li>
         
         <li>The code that handles a click on the
        filter button now needs to be changed, so that an
        implementor of the interface "TextFilter" is located
        and loaded.
        When such an implementor is found, it is invoked to
        filter the text.
        <p>Before we can do this, we need to
        add a dependency in the Project Properties dialog of
        the "WordEngine" module to the "TextFilter" module:</p>

    <p><img src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp12.png"/></p>

<p>Now, you can load implementations of the
"TextFilter" class, as shown below:</p>

<pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    String s = text.getText();
    <b>TextFilter filter = Lookup.getDefault().lookup(TextFilter.class)</b>;
    if (filter != null) {
	 s = filter.process(s);
    }
    text.setText(s);
}</pre>

         <p class="tips"> The above could be done via the
          JDK 6 "ServiceLoader" class, except that the
          "Lookup" class can be used in JDK's prior
          to JDK 6. Aside from that, the "Lookup" class
          has a number of additional features, as the
          next section will illustrate.</p>
         </li>
    </ol>

     <p>Now you are ready to run the code and check
         that everything works just as before. While the functionality
         is the same, the new modular design offers a clear separation
         between the graphical user interface and the implementation
         of the filter. The new application can also be extended
         quite easily, simply by adding new service providers to
         the application's classpath.</p>

<p>As an exercise, you could change the code,
         so that ALL found text filters (use the method "lookupAll")
         are applied consecutively on the text. For example,
         add a text filter
         implementation that removes all whitespaces and then test
         the resulting application.</p>
    
    <!-- ===================================================================================== -->

    <h2 class="tutorial"><a name="listener"></a>LookupListener and InstanceContent</h2>

    <p>We create a fourth module, which receives texts
     dynamically whenever we click the "Filter!" button
     in our first module.</p>

    <ol>
         <li>In the first module, change the
         constructor of the "TextTopComponent" as follows:

<pre class="examplecode"><b>private InstanceContent content;</b>

private TextTopComponent() {
    initComponents();
    setName(NbBundle.getMessage(TextTopComponent.class, "CTL_TextTopComponent"));
    setToolTipText(NbBundle.getMessage(TextTopComponent.class, "HINT_TextTopComponent"));
//        setIcon(Utilities.loadImage(ICON_PATH, true));

    <b>content = new InstanceContent();
    associateLookup(new AbstractLookup(content));</b>

}</pre></li>

         <li>Change the code of the filter
         button so that the old value is added to
         the <tt>InstanceContent</tt> object when the button is clicked.

<pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    String s = text.getText();
    TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
    if (filter != null) {
        <b>content.add(s);</b>
        s = filter.process(s);
    }
    text.setText(s);
}</pre></li>

         <li>Create a new module called "History"
             with code name base "com.demo.history".</li>
         <li>In the History module, create a
         new window component with prefix "History",
         in the "com.demo.history" package. Specify that
         it should appear in the "editor" position. Once
         you have created the window, add a
         text area to it. Change the variable
         name of the text area to "historyText".</li>
         
         <li>Add code to the constructor of the HistoryTopComponent class so
         that it listens to the lookup of the <tt>String</tt> class
         of the current active window. It displays all retrieved
         <tt>String</tt> objects in the text area:

<pre class="examplecode"><b>private Lookup.Result result;</b>

private HistoryTopComponent() {

    ...

    <b>result = org.openide.util.Utilities.actionsGlobalContext().lookupResult(String.class);
    result.addLookupListener(new LookupListener() {
        public void resultChanged(LookupEvent e) {
            historyText.setText(result.allInstances().toString());
        }
    });</b>
}</pre></li>

     <li>Then you can start the application and
     experiment with it. The result should look similar
     to the one shown in the screenshot below:

    <p><img src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp13.png"/></p>

<p>As an exercise, you can change the type of the
 lookup result from <tt>String</tt> to <tt>Object</tt> and see
 what happens when you select different windows.</p></li>

 </ol>

     <p>Congratulations! At this stage, with very little coding,
 you have created a small example of a modular
 application:</p>

     <p><img src="https://platform.netbeans.org/images/tutorials/quickstart-platform/wordapp14.png"/></p>

<p>The application consists of 4 modules. Code from one module can only
 be used by another module if (1) the first module explicitly exposes
 packages and (2) the second module sets a dependency on the first module.
 In this way, the NetBeans Platform helps to organize your code in a
 strict modular architecture, ensuring that code isn't reused randomly
 but only when there are contracts set between the modules that provide
the code.</p>

     <p>Secondly, the <tt>Lookup</tt> class has been introduced as
 a mechanism for communicating between modules, as an extension of the
 JDK 6 ServiceLoader approach. Implementations are loaded via their
 interfaces. Without using any code from an implementation, the "WordEngine"
 module is able to display the service provided by the implementor. Loose
coupling is provided to NetBeans Platform applications in this way.</p>

<p class="tips"> To continue learning about modularity
 and the NetBeans Platform, head on to
 the 4-part "NetBeans Platform Selection
 Management" series, <a href="https://platform.netbeans.org/tutorials/nbm-selection-1.html">which starts here</a>.
 After that, get started with the <a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a>, choosing
 the tutorials that are most relevant to your particular business scenario. Also,
 whenever you have questions about the NetBeans Platform, of any kind, feel free
 to write to the mailing list, dev@platform.netbeans.org, its related
archive <a href="https://netbeans.org/projects/platform/lists/dev/archive">is here</a>.</p>

 <p>Have fun with the NetBeans Platform and see you on the mailing list!</p>

 

</body>

</html>
