<!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>Paint Application Tutorial for NetBeans Platform</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 guide to creating a Paint application."/>
        <!--     Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>

        <h1>NetBeans Platform Paint Application Tutorial</h1>

        <p>This tutorial takes you through the basics of using NetBeans IDE to develop rich-client applications
            on top of the NetBeans Platform. When you develop applications on top of the NetBeans Platform, you are
            developing on top of the NetBeans IDE's core. All the modules belonging to the IDE that are not relevant to
            your application are excluded, but those that are useful are kept. By reusing features readily available in IDE's core,
            you save yourself a lot of time and energy. </p>

        <p><strong class="notes">Note: </strong>This document uses NetBeans Platform 8.0 and
            NetBeans IDE 8.0. If you
            are using an earlier version, see <a href="74/nbm-paintapp.html">the previous version
                of this document</a>.</p>

        <p><b>Contents</b></p>

        <p><img src="../images/articles/80/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 8.0" title="Content on this page applies to NetBeans IDE 8.0"/></p>
        <ul class="toc">
            <li><a href="#intro">Introduction to the Paint Application</a></li>
            <li><a href="#setup">Setting Up the Paint Application</a>
                <ul>
                    <li><a href="#creatingModuleSuite">Creating the Application Skeleton</a></li>
                    <li><a href="#creatingModProj">Creating the Module</a></li>
                </ul>
            </li>
            <li><a href="#impMod">Creating and Embedding the Paint Canvas</a>
                <ul>
                    <li><a href="#creatingCanv">Creating the Canvas</a></li>
                    <li><a href="#prepTopComp">Embedding the Canvas in a Window</a></li>
                </ul>
            </li>
            <li><a href="#runPack">Running, Branding, and Packaging the Application</a>
                <ul>
                    <li><a href="#run">Running the Application</a></li>
                    <li><a href="#brand">Branding the Application</a></li>
                    <li><a href="#package">Packaging the Application</a></li>
                </ul>
            </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 8.0 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 7 or above</td>
                </tr>
            </tbody>
        </table>

        <p class="tips">For troubleshooting purposes, you are welcome to download the <a href="http://java.net/projects/nb-api-samples/sources/api-samples/show/versions/8.0/tutorials/PaintApp">completed tutorial source code</a>.</p>

        <p><a name="intro"></a></p><h2>Introduction to the Paint Application</h2>

        <p>This tutorial is designed to get you going as quickly as possible.
            You will create a simple application on the NetBeans Platform. The 
            application allows the user to
            paint on the screen:</p>

        <p><img src="../images/tutorials/paintapp/73/result-2.png" alt="image of completed application"/></p>

        <p>This initial version is far from a full fledged 
            paint application, but it demonstrates a very simple case of creating an application on top of the NetBeans Platform.</p>

        <p><b class="notes">Note:</b> The 
            <a href="nbm-google.html">NetBeans Plugin Quick Start</a> is a better tutorial for you if, instead of
            rich-client applications, you want to
            learn about NetBeans modules. </p>

        <p><a name="setup"></a></p><h2>Setting Up the Paint Application</h2>

        <p>In this section, you create the structure of your application. You first need to create an application skeleton, which you
            can do via a wizard. Then you will create the module that will contain your code.</p>

        <div class="indent">

            <h3 class="tutorial"><a name="creatingModuleSuite"></a>Creating the Application Skeleton</h3>

            <p>The "NetBeans Platform Application" template will create your application's skeleton.
                The skeleton will consist of a set of modules that
                work together to form the basis of your application. You will use the Project Properties dialog to assign your application's splashscreen, 
                application name, and the type and number of NetBeans modules that you want to use. You can also take advantage
                of such actions as creating a ZIP distribution and building a Java WebStart (JNLP) application, which are
                important tools in making your application available to other users.</p>

            <div class="indent">
                <ol>
                    <li><p>Choose File &gt; New Project. Under Categories, select NetBeans Modules. Under projects, 
                            select NetBeans Platform Application:</p>
                        <p><img src="../images/tutorials/paintapp/73/new-app-1.png" alt="project template"/></p>
                        <p>Click Next.</p></li>
                    <li><p>In the Name and Location panel, type <tt>PaintApp</tt> in Project Name.
                            Change the
                            Project Location to any directory on your computer:</p>
                        <p><img src="../images/tutorials/paintapp/73/new-app-2.png" alt="project template"/></p>
                        <p>Click Finish.</p></li>
                    <li><p>The new application skeleton opens in the IDE. Look at the new
                            project structure:</p>
                        <p><img src="../images/tutorials/paintapp/73/new-app-3.png" alt="project template"/></p>
                        <p class="tips">You see two subnodes in the Projects window. The first subnode, the "Modules" node,
                            shows you the custom modules that are part of the application. Right now, as you can
                            see, there are none. You can right-click on this subnode and then invoke wizards
                            for creating new modules or for wrapping external JARs into the application. 
                            The "Important Files" node shows the build scripts and
                            other supporting files used by the application.</p></li>
                    <li><p>Right-click the application and choose Run. The default splash screen is shown
                            and then you see the starting point of your new application:</p>
                        <p><img src="../images/tutorials/paintapp/73/new-app-4.png" alt="project template"/></p>
                        <p>Look through the menu
                            bar and the toolbar to see the features that your application already has, such
                            as an Exit menu item, a Properties window, and an Output window.</p></li>
                </ol>
            </div>

            <h3 class="tutorial"><a name="creatingModProj"></a>Creating the Functionality Module</h3>
            <p>Now you need a module to contain the actual code you're going to write.</p>
            <div class="indent">

                <ol>
                    <li><p>Right-click the "Modules" node in the Paint Application. Select Add New:</p>
                        <p><img src="../images/tutorials/paintapp/73/new-mod-1.png" alt="name and location panel"/></p>
                    </li>
                    <li><p>In the Name and Location panel, type <tt>Paint</tt> in Project Name.</p>
                        <p><img src="../images/tutorials/paintapp/73/new-mod-2.png" alt="name and location panel"/></p>
                        <p>Notice that the module sources will be stored within a folder in
                            the application's directory on disk. Click Next.</p></li>

                    <li><p>In the Basic Module Configuration panel, type <tt>org.netbeans.paint</tt> as the
                            "Code Name Base". The code name base is a unique string identifying the module
                            to other modules in the application.
                            Leave everything unchanged.</p>
                        <p><img src="../images/tutorials/paintapp/73/new-mod-3.png" alt="name and location panel"/></p>
                        <p>Click Finish. The IDE creates the <tt>Paint</tt>
                            project.</p></li>
                    <li><p>Take a look at the structure of your application.
                            The project contains all of your sources and
                            project metadata, such as the project's Ant build script. The project
                            opens in the IDE. You can view its logical structure in the Projects window (Ctrl-1) and its
                            file structure in the Files window (Ctrl-2). For example, the Projects 
                            window should look as follows:</p>
                        <p><br/><img src="../images/tutorials/paintapp/73/new-mod-4.png" alt="name and location panel"/></p>
                    </li>

                    <li><p>You will need to subclass several classes that belong to the <a href="http://bits.netbeans.org/dev/javadoc/index.html">NetBeans APIs</a>. 
                            All NetBeans APIs are implemented by modules, 
                            so this task really just means
                            adding some modules to the list of modules that our module needs in order to run.
                            In the Projects window, right-click the <tt>Paint</tt> project node and choose Properties.
                            The Project Properties dialog box opens. Under Categories, click Libraries.
                            For each of the API's listed in the table below, click "Add Dependency..." and then, in the Filter text box, start typing the name of the
                            class that you want to subclass.</p>
                        <p></p>
                        <table width="76%" border="1">
                            <tbody>
                                <tr>
                                    <td>
                                        <div><b>Class</b></div>
                                    </td>
                                    <td>
                                        <div><b>API</b></div>
                                    </td>

                                    <td>
                                        <div><b>Purpose</b></div>
                                    </td>
                                </tr>
                                <tr>
                                    <td><tt>Lookup</tt></td>
                                    <td><tt>Lookup API</tt></td>

                                    <td>Enables loosely coupled communication between modules.</td>
                                </tr>
                                <tr>
                                    <td><tt>ActionID</tt></td>
                                    <td><tt>UI Utilities API</tt></td>

                                    <td>Provides annotations for registering Actions
                                        in the NetBeans Platform virtual filesystem, as
                                        well as the <tt>ColorComboBox</tt> class.</td>
                                </tr>
                                <tr>
                                    <td><tt>Messages</tt></td>
                                    <td><tt>Utilities API</tt></td>

                                    <td>Provides a variety of general utility classes,
                                        including support for internationalization
                                        via the Bundle class and <tt>@Messages</tt> annotation.</td>
                                </tr>
                                <tr>
                                    <td><tt>TopComponent</tt></td>
                                    <td><tt>Window System API</tt></td>

                                    <td>Gives you access to the NetBeans window system.</td>
                                </tr>

                            </tbody>
                        </table>
                        <br/>
                        <p>The first column in the table above lists all the classes that you will subclass in this tutorial.
                            In each case, start typing the class name in the Filter and watch the Module list narrow. Use the table's second column to pick the appropriate API (or, in the case of <tt>ColorChooser</tt>, the library) from the narrowed Module list and then click OK to confirm the choice.
                            Click OK to exit the Project Properties dialog box.</p>
                        <p>In the Projects window, expand the Paint module's project node and
                            then expand the Libraries node. Notice that all the libraries you have
                            selected are displayed:</p>
                        <p><img src="../images/tutorials/paintapp/73/new-dep-1.png" alt="initial-proj-window"/></p>
                        <p>Expand the Paint module's Important Files node and double-click 
                            the Project Metadata node. Notice that the API's you 
                            selected have been declared as module dependencies
                            in the file. When the module is compiled, the declared dependencies
                            are added to the module's manifest file.</p></li>
                </ol>
            </div>
        </div>
        <h2><a name="impMod"></a>Creating and Embedding the Paint Canvas</h2> 


        <div class="indent">
            <h3 class="tutorial"><a name="creatingCanv"></a>Creating the Canvas</h3>
            <p>The next step is to create the actual component on which the user can paint. Here, you use a pure Swing component&#8212;so, let's 
                skip the details of its implementation and just provide the final version. The color chooser bean, which you created the library 
                wrapper module for, is used in the source code for this panel&#8212;when you run the finished application, you will see it
                in the toolbar of the panel for editing images.</p>
            <div class="indent">

                <ol>
                    <li>In the Projects window, expand the <tt>Paint</tt> node, then expand the Source Packages node, and then
                        right-click the <tt>org.netbeans.paint</tt> node. Choose New &gt; Java Class.</li>
                    <li>Enter <tt>PaintCanvas</tt> as the Class Name. Ensure that <tt>org.netbeans.paint</tt> is listed as the 
                        Package. Click Finish. <tt>PaintCanvas.java</tt> opens in the Source editor.</li>
                    <li>Replace the default content of the file with the content found 
                        <a href="../images/tutorials/paintapp/70/PaintCanvas.java">here</a>. 
                        If you named your package something other than <tt>org.netbeans.paint</tt>, correct the package name in the 
                        Source editor.</li> 
                </ol>
            </div>
            <h3 class="tutorial"><a name="prepTopComp"></a>Embedding the Canvas in a Window</h3>

            <p>Now you'll write the only class in this application that needs to
                touch the <a href="http://bits.netbeans.org/dev/javadoc/index.html">NetBeans APIs</a>. It is a <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a></tt> class. A <tt>TopComponent</tt> class is 
                just a <tt>JPanel</tt> class which the NetBeans windowing system knows how to talk 
                to&#8212;so that it can be put inside a tabbed 
                container inside the main window.</p>
            <div class="indent">

                <ol>
                    <li>In the Projects window, expand the <tt>Paint</tt> node, then expand the Source Packages node, and then
                        right-click the <tt>org.netbeans.paint</tt> node. Choose New &gt; Java Class.
                        Enter <tt>PaintTopComponent</tt> as the Class Name. Ensure that <tt>org.netbeans.paint</tt> is listed as the 
                        Package. Click Finish. <tt>PaintTopComponent.java</tt> opens in the Source editor.</li>
                    <li>Near the top of the file, change the class declaration to the following:
                        <pre class="examplecode">public class PaintTopComponent extends TopComponent implements ActionListener, ChangeListener {</pre></li>
                    <li>Press Ctrl-Shift-I to fix imports and click OK. The IDE makes the necessary import package
                        declarations at the top of the file:
                        <pre class="examplecode">import java.awt.event.ActionListener;
import javax.swing.event.ChangeListener;
import org.openide.windows.TopComponent;</pre>        

                        <p>Notice the red line under the class declaration that you just entered. Position the cursor in the line and notice that a 
                            light bulb appears in the left margin. Click the light bulb (or press Alt-Enter), as shown below:</p>

                        <p><img src="../images/tutorials/paintapp/73/new-dep-2.png" alt="initial-proj-window"/></p>

                        <p>Select Implement all 
                            abstract methods. The IDE generates two method skeletons&#8212;<tt>actionPerformed()</tt> and <tt>stateChanged()</tt>. You will fill these
                            out later in this tutorial.</p></li>

                    <li>Register the <tt>PaintTopComponent</tt> in the window system by adding annotations
                        to the top of the class, as shown here, and then press Ctrl-Shift-I to let the IDE
                        generate the appropriate import statements:

                        <pre class="examplecode"><a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Description.html">@TopComponent.Description</a>(
        preferredID = "PaintTopComponent",
        iconBase = "/org/netbeans/paint/new_icon.png", 
        persistenceType = TopComponent.PERSISTENCE_ALWAYS)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Registration.html">@TopComponent.Registration</a>(
        mode = "editor", 
        openAtStartup = true)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionID.html">@ActionID</a>(
        category = "Window", 
        id = "org.netbeans.paint.PaintTopComponent")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReferences.html">@ActionReferences</a>({
    <a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">@ActionReference</a>(
        path = "Menu/Window", 
        position = 0),
    <a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">@ActionReference</a>(
        path = "Toolbars/File", 
        position = 0)
})
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.OpenActionRegistration.html">@TopComponent.OpenActionRegistration</a>(
        displayName = "#CTL_NewCanvasAction")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">@Messages</a>({
        "CTL_NewCanvasAction=New Canvas",
        "LBL_Clear=Clear",
        "LBL_Foreground=Foreground",
        "LBL_BrushSize=Brush Size",
        "# {0} - image",
        "UnsavedImageNameFormat=Image {0}"})
public class PaintTopComponent extends TopComponent implements ActionListener, ChangeListener {</pre>          
                        <p class="notes"><b>Note:</b> While the module is being compiled, the annotations
                            above will be processed. XML entries will be created in the module's <tt>generated-layer.xml</tt>
                            file, for each of the @TopComponent* and @Action* annotations. The <tt>generated-layer.xml</tt>
                            file will be contributed by the module to the System Filesystem of the application. Read
                            more <a href="http://wiki.netbeans.org/DevFaqSystemFilesystem">about the System Filesystem here</a>. For example, the <tt>PaintTopComponent</tt> will be displayed
                            in the main area of the application, defined by the "editor"
                            position, as specified by the <tt>@TopComponent.Registration</tt> annotation above. For each
                            item defined in the <tt>@Messages</tt> annotation, a new key/value string is generated into a <tt>Bundle.java</tt>
                            class.</p></li>
                    <li><p>Add these two icons to "org/netbeans/paint":</p>     
                        <p><img src="../images/tutorials/paintapp/70/new_icon.png" alt="Lightbulb."/>
                            <img src="../images/tutorials/paintapp/70/new_icon24.png" alt="Lightbulb."/></p>
                        <p>The 16x16 pixel icon will be used for the Small Toolbar Icons display,
                            while the 24x24 pixel icon will be used for the Large Toolbar display, as
                            well as in the tab of the window, as defined by <tt>@TopComponent.Description</tt> above.</p>
                    </li>
                    <li>The <tt>TopComponent</tt> class is a wrapper for the <tt>Canvas</tt> you created earlier. All
                        the new import statements and code below is normal Java Swing code. Copy it below and paste it into your <tt>PaintTopComponent</tt> source file:

                        <pre class="examplecode">package org.netbeans.paint;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JToolBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ColorComboBox;
import org.openide.util.NbBundle.Messages;
import org.openide.windows.TopComponent;

@TopComponent.Description(
        preferredID = "PaintTopComponent",
        iconBase = "/org/netbeans/paint/new_icon.png", 
        persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(
        mode = "editor", 
        openAtStartup = true)
@ActionID(
        category = "Window", 
        id = "org.netbeans.paint.PaintTopComponent")
@ActionReferences({
    @ActionReference(
        path = "Menu/Window", 
        position = 0),
    @ActionReference(
        path = "Toolbars/File", 
        position = 0)
})
@TopComponent.OpenActionRegistration(
        displayName = "#CTL_NewCanvasAction")
@Messages({
    "CTL_NewCanvasAction=New Canvas",
    "LBL_Clear=Clear",
    "LBL_Foreground=Foreground",
    "LBL_BrushSize=Brush Size",
    "# {0} - image",
    "UnsavedImageNameFormat=Image {0}"})
public class PaintTopComponent extends TopComponent implements ActionListener, ChangeListener {

    private PaintCanvas canvas = new PaintCanvas(); //The component the user draws on
    private final JComponent preview = canvas.getBrushSizeView(); //A component in the toolbar that shows the paintbrush size
    private final JSlider brushSizeSlider = new JSlider(1, 24); //A slider to set the brush size
    private final JToolBar toolbar = new JToolBar(); //The toolbar
    private final ColorComboBox color = new ColorComboBox(); //Our color chooser component from the ColorChooser library
    private final JButton clear = new JButton(Bundle.LBL_Clear()); //A button to clear the canvas
    private final JLabel label = new JLabel(Bundle.LBL_Foreground()); //A label for the color chooser
    private final JLabel brushSizeLabel = new JLabel(Bundle.LBL_BrushSize()); //A label for the brush size slider
    private static int ct = 0; //A counter you use to provide names for new images

    public PaintTopComponent() {
        initComponents();
        setDisplayName(Bundle.UnsavedImageNameFormat(ct++));
    }

    private void initComponents() {
        
        setLayout(new BorderLayout());

        //Configure our components, attach listeners:
        color.addActionListener(this);
        clear.addActionListener(this);
        brushSizeSlider.setValue(canvas.getBrushDiameter());
        brushSizeSlider.addChangeListener(this);
        color.setSelectedColor(canvas.getColor());
        color.setMaximumSize(new Dimension(16, 16));

        //Install the toolbar and the painting component:
        add(toolbar, BorderLayout.NORTH);
        add(new JScrollPane(canvas), BorderLayout.CENTER);

        //Configure the toolbar:
        toolbar.setLayout(new FlowLayout(FlowLayout.LEFT, 7, 7));
        toolbar.setFloatable(false);

        //Now populate our toolbar:
        toolbar.add(label);
        toolbar.add(color);
        toolbar.add(brushSizeLabel);
        toolbar.add(brushSizeSlider);
        toolbar.add(preview);
        toolbar.add(clear);
        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JButton) {
            canvas.clear();
        } else if (e.getSource() instanceof ColorComboBox) {
            ColorComboBox cc = (ColorComboBox) e.getSource();
            canvas.setColor(cc.getSelectedColor());
        }
    }

    @Override
    public void stateChanged(ChangeEvent e) {
        canvas.setBrushDiameter(brushSizeSlider.getValue());
    }
    
}</pre>
                    </li>   
                </ol>
            </div>
        </div>

        <h2><a name="runPack"></a>Running, Branding, and Packaging the Application</h2>

        <p>In this section, you try out the application and then package it for distribution to your users.</p>

        <div class="indent">
            <h3 class="tutorial"><a name="run"></a>Running the Application</h3>
            <div class="indent">
                <ol>
                    <li><p>Right-click the application and choose Run:</p>
                        <p><img src="../images/tutorials/paintapp/73/run-1.png" alt="image of completed application"/></p>
                    </li>
                    <li><p>The application starts up, a splash screen is displayed, and then your application is shown.
                            Paint something, as shown below:</p>
                        <p><img src="../images/tutorials/paintapp/73/result-2.png" alt="image of completed application"/></p>
                    </li>
                    <li><p>Use the application and try to identify areas where you'd like to provide
                            more functionality.</p>
                    </li>
                </ol>
            </div>
        </div>
        <div class="indent">
            <h3 class="tutorial"><a name="brand"></a>Branding the Application</h3>
            <div class="indent">
                <ol>
                    <li><p>Right-click the application and choose Branding.</p></li>
                    <li><p>The Branding Window is shown, use it to change icons, the splash screen, the window features,
                            and the strings displayed in the application:</p>
                        <p><img src="../images/tutorials/paintapp/73/brand-1.png" alt="image of completed application"/></p>
                    </li>
                </ol>
            </div>
        </div>
        <div class="indent">
            <h3 class="tutorial"><a name="package"></a>Packaging the Application</h3>
            <div class="indent">
                <ol>
                    <li><p>Right-click the application and choose Package as:</p>
                        <p><img src="../images/tutorials/paintapp/73/dist-1.png" alt="image of completed application"/></p>
                    </li>
                    <li><p>Choose the distribution mechanism relevant to your business needs and
                            your user requirements.</p>
                    </li>
                    <li><p>Switch to the Files window (Ctrl-2) to see the result.</p>
                    </li>
                </ol>
            </div>
        </div>

        <p>That's it! You have completed the Paint Application. You have learned how to set up a NetBeans
            Platform application and how to create a new
            window that displays something to the user.</p>
        <p>Next, you are recommended to work through the <a href="https://platform.netbeans.org/tutorials/nbm-crud.html">NetBeans Platform CRUD Application Tutorial</a>, which
            will teach you how to create a business-oriented NetBeans Platform application that interacts with a database.</p>

        <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback: NetBeans Platform Paint Application Tutorial 8.0">Send Us Your Feedback</a></div>

    </body>
</html>
