| <!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>Platform Tutorial for Geospatial Systems</title> | |
| <meta name="AUDIENCE" content="NBUSER"/> | |
| <meta name="TYPE" content="ARTICLE"/> | |
| <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/> | |
| <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 setting up an geospatial environment | |
| with the NetBeans Platform."/> | |
| <!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. --> | |
| <!-- Use is subject to license terms.--> | |
| </head> | |
| <body> | |
| <h1>NetBeans Platform Tutorial for Geospatial Systems</h1> | |
| <p>The NetBeans Platform is a solid infrastructure for | |
| geospatial systems. It provides | |
| a docking framework with full screen mode, an application frame | |
| within which a map can be placed, and a loosely coupled module system for | |
| the organization of code into feature-oriented interdependent plugins.</p> | |
| <p>In this tutorial, you are shown how to set up a typical | |
| geospatial application structure, leveraging the central features | |
| of the NetBeans Platform. You start by creating a new application, | |
| you add several modules, each representing a feature in | |
| your geospatial system, you configure the application to start | |
| up in full screen mode and hide tabs, while you integrate various | |
| mapping solutions.</p> | |
| <p>By the end of this tutorial, you will have learned how to | |
| set up a powerful geospatial application infrastructure and | |
| configure the NetBeans Platform to optimize it for typical | |
| geospatial scenarios, while also learning how to integrate a variety | |
| of map technologies into your NetBeans Platform application, | |
| such as OpenMap, shown below:</p> | |
| <p><img alt="openmap" src="../images/tutorials/air/72/openmap-nb-small.png"/></p> | |
| <p><b>Contents</b></p> | |
| <p><img src="../images/articles/73/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.1" title="Content on this page applies to NetBeans IDE 7.1"/></p> | |
| <ul class="toc"> | |
| <li><a href="#application">Creating the Application</a></li> | |
| <li><a href="#feature">Creating Features</a></li> | |
| <li><a href="#map">Integrating Map Technologies</a> | |
| <ul> | |
| <li><a href="#openmap">Scenario 1: OpenMap</a></li> | |
| <li><a href="#geotk">Scenario 2: Geotoolkit</a></li> | |
| </ul> | |
| </li> | |
| <li><a href="#publish">Publishing and Subscribing to Objects of Interest</a></li> | |
| <li><a href="#configure">Configuring the Geospatial System</a> | |
| <ul> | |
| <li><a href="#fullscreen">Starting Up in Full Screen Mode</a></li> | |
| <li><a href="#undocked">Starting Up in Undocked Mode</a></li> | |
| <li><a href="#tabs">Removing Tabs</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 7.3 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 above</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <p></p> | |
| <!-- ===================================================================================== --> | |
| <h2 class="tutorial"><a name="application"></a>Creating the Application</h2> | |
| <p>We start by creating a new NetBeans Platform application as a starting | |
| point for our geospatial system.</p> | |
| <div class="indent"> | |
| <ol> | |
| <li><p>Choose File | New Project and then choose NetBeans Modules. | |
| Select "NetBeans Platform Application", as shown below:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-app-1.png" alt="Fig 2"/></p> | |
| <br/> | |
| <p>Click Next. Name your new application "MyGeospatialSystem" and specify a folder on disk | |
| for storing it:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-app-2.png" alt="Fig 2"/></p> | |
| <br/> | |
| <p>Click Finish. The new project appears as follows in the Projects window:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-app-3.png" alt="Fig 2-1"/></p> | |
| </li> | |
| <li><p>Right-click the application and choose Run. The application | |
| deploys and you should see this:</p> | |
| <br/> | |
| <p><img alt="create new module" src="../images/tutorials/air/73/new-app-4.png"/></p> | |
| <br/> | |
| <p>Explore the menus and toolbars to see the available features | |
| that are part of your geospatial system out of the box.</p> | |
| </li> | |
| </ol> | |
| </div> | |
| <p>You have learned how to create a new NetBeans Platform application, | |
| which is the starting point for your geospatial system.</p> | |
| <!-- ===================================================================================== --> | |
| <h2 class="tutorial"><a name="feature"></a>Creating Features</h2> | |
| <p>Each feature in your application, such as a map feature or a country browser feature, | |
| will be contained within a NetBeans module. Modulerizing your features in this way | |
| lets you create multiple different distributions of your software, each consisting | |
| of a variety of different features provided by different modules. We start by creating | |
| a new NetBeans module to contain a map feature.</p> | |
| <div class="indent"> | |
| <ol> | |
| <li><p>Right-click the Modules node and choose Add New, as shown below:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-mod-1.png" alt="mod 1"/></p> | |
| </li> | |
| <li> | |
| <p>Type Map and specify that the module should be stored within the application:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-mod-2.png" alt="mod 2"/></p> | |
| <br/> | |
| <p>Click Next.</p> | |
| </li> | |
| <li> | |
| <p>Type <tt>org.geospatial.map</tt> as the unique identifier for the module:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-mod-3.png" alt="mod 3"/></p> | |
| <br/> | |
| <p>Click Finish. You should see that your application has a new module:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-mod-4.png" alt="mod 4"/></p> | |
| <p>You now have the container for a new feature. Next, we're going to | |
| add some JARs providing NetBeans APIs to the classpath of the module | |
| so that we can begin creating the starting point of our features.</p> | |
| </li> | |
| <li> | |
| <p>Right-click the Libraries node and choose Add Module Dependency, as shown | |
| below:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/add-lib-1.png" alt="mod 3"/></p> | |
| <br/> | |
| <p>Choose the following modules:</p> | |
| <br/> | |
| <ul> | |
| <li>Lookup API</li> | |
| <li>UI Utilities API</li> | |
| <li>Utilities API</li> | |
| <li>Window System API</li> | |
| </ul> | |
| <br/> | |
| <p>Click OK and notice that the Libraries node now lists the | |
| new module dependencies you selected:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/add-lib-3.png" alt="mod 4"/></p> | |
| </li> | |
| <li> | |
| <p>Right-click the <tt>org.geospatial.map</tt> and create a new Java class. Name | |
| it <tt>MyMapTopComponent.java</tt>. Define it as follows:</p> | |
| <pre class="examplecode">package org.geospatial.map; | |
| import org.openide.awt.ActionID; | |
| import org.openide.awt.ActionReference; | |
| import org.openide.awt.ActionReferences; | |
| import org.openide.util.NbBundle.Messages; | |
| import org.openide.windows.TopComponent; | |
| @TopComponent.Description( | |
| preferredID = "MyMapTopComponent", | |
| persistenceType = TopComponent.PERSISTENCE_ALWAYS) | |
| @TopComponent.Registration( | |
| mode = "editor", | |
| openAtStartup = true) | |
| @ActionID( | |
| category = "Window", | |
| id = "org.geospatial.map.MyMapTopComponent") | |
| @ActionReferences({ | |
| @ActionReference( | |
| path = "Menu/Window", | |
| position = 0) | |
| }) | |
| @TopComponent.OpenActionRegistration( | |
| displayName = "#CTL_MyMapAction") | |
| @Messages( | |
| "CTL_MyMapAction=Open Map") | |
| public class MyMapTopComponent extends TopComponent { | |
| @Messages("CTL_MyMapName=Map") | |
| public MyMapTopComponent() { | |
| setDisplayName(Bundle.CTL_MyMapName()); | |
| } | |
| }</pre> | |
| </li> | |
| <li> | |
| <p>Run the application again and notice that you now have a new window:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/new-map-1.png" alt="mod 3"/></p> | |
| <p class="tips">In the same way as you have now done, you can very easily | |
| create more new windows throughout your application.</p> | |
| </li> | |
| </ol> | |
| </div> | |
| <p>You have the basis of your first feature. In the next section, you will | |
| integrate one or more map technologies into your feature.</p> | |
| <!-- ===================================================================================== --> | |
| <h2 class="tutorial"><a name="map"></a>Integrating Map Technologies</h2> | |
| <p>A variety of map technologies exist. In the subsections that follow, | |
| you will learn how to integrate a range of different map technologies | |
| into your NetBeans Platform application. Each of the scenarios below | |
| are alternatives, each building on top of the previous sections of this tutorial.</p> | |
| <div class="indent"> | |
| <h3 class="tutorial"><a name="openmap"></a>Scenario 1: OpenMap</h3> | |
| <p><a href="http://openmap.bbn.com/">OpenMap</a> is | |
| an open-source map technology.</p> | |
| <p><img alt="openmap" src="../images/tutorials/air/72/openmap-nb-small.png"/></p> | |
| <div class="indent"> | |
| <ol> | |
| <li>Download OpenMap: <a href="http://openmap.bbn.com/cgi-bin/license.cgi">http://openmap.bbn.com/cgi-bin/license.cgi</a></li> | |
| <li><p>Right-click the application's Modules node, | |
| choose Add New Library:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/openmap-1.png" alt="mod 3"/></p> | |
| <p>Then create a library | |
| wrapper module that wraps the OpenMap JAR files. Name | |
| the module OpenMapLib and use <tt>org.openmap</tt> as the code name base. | |
| When you complete the wizard, you should see your new module, with the Libraries | |
| node listing the OpenMap JARs:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/openmap-2.png" alt="mod 3"/></p> | |
| <p>Next, set a dependency on the OpenMapLib module after right-clicking | |
| the Map module's Libraries node and choosing Add Module Dependency, | |
| as shown below:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/add-dep-1.png" alt="mod 3"/></p> | |
| <br/> | |
| <p>You should notice that the OpenMapLib module is now a dependency | |
| in your Map module, so that you can use the OpenMap JARs in | |
| your Map module:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/add-dep-2.png" alt="mod 3"/></p> | |
| </li> | |
| <li><p>In the MapTopComponent, use OpenMap as follows, as a first | |
| example to get started with your OpenMap/NetBeans Platform | |
| integration:</p> | |
| <pre class="examplecode">public class MyMapTopComponent extends TopComponent { | |
| private final InstanceContent ic = new InstanceContent(); | |
| @Messages("CTL_MyMapName=Map") | |
| public MyMapTopComponent() { | |
| setDisplayName(Bundle.CTL_MyMapName()); | |
| setLayout(new BorderLayout()); | |
| try { | |
| //MapPanel: | |
| MapPanel mapPanel = new BasicMapPanel(); | |
| //MapHandler: | |
| MapHandler mapHandler = mapPanel.getMapHandler(); | |
| mapHandler.add(new LayerHandler()); | |
| mapHandler.add(this); | |
| //MapBean: | |
| MapBean mapBean = mapPanel.getMapBean(); | |
| mapBean.setScale(120000000f); | |
| //Selection: | |
| MouseDelegator mouseDelegator = new MouseDelegator(); | |
| mapHandler.add(mouseDelegator); | |
| SelectMouseMode selectMouseMode = new SelectMouseMode(); | |
| mapHandler.add(selectMouseMode); | |
| mouseDelegator.setActive(selectMouseMode); | |
| //MapMouseListener: | |
| final MyMapMouseListener myMapMouseListener = new MyMapMouseListener(); | |
| //ShapeLayer: | |
| ShapeLayer shapeLayer = new ShapeLayer() { | |
| @Override | |
| public synchronized MapMouseListener getMapMouseListener() { | |
| return myMapMouseListener; | |
| } | |
| }; | |
| //Properties: | |
| Properties shapeLayerProps = new Properties(); | |
| shapeLayerProps.put("lineColor", "000000"); | |
| shapeLayerProps.put("fillColor", "BDDE83"); | |
| shapeLayerProps.put("shapeFile", "org/geospatial/map/dcwpo-browse.shp"); | |
| shapeLayerProps.put("spatialIndex", "org/geospatial/map/dcwpo-browse.ssx"); | |
| //Assign properties to ShapeLayer: | |
| shapeLayer.setProperties(shapeLayerProps); | |
| shapeLayer.setVisible(true); | |
| //Assign ShapeLayer to MapHandler: | |
| mapHandler.add(shapeLayer); | |
| add(mapPanel.getMapBean(), BorderLayout.CENTER); | |
| } catch (MultipleSoloMapComponentException msmce) { | |
| } | |
| associateLookup(new AbstractLookup(ic)); | |
| } | |
| public class MyMapMouseListener implements MapMouseListener { | |
| @Override | |
| public String[] getMouseModeServiceList() { | |
| return new String[]{SelectMouseMode.modeID}; | |
| } | |
| @Override | |
| public boolean mouseClicked(MouseEvent e) { | |
| MapMouseEvent mme = (MapMouseEvent) e; | |
| //Optionally: | |
| //LatLonPoint latLonPoint = LatLonPoint.getFloat(mme.getLatLon()); | |
| //UTMPoint utmPoint = UTMPoint.LLtoUTM(latLonPoint); | |
| //Publish something into Lookup: | |
| ic.set(Collections.singleton(mme.getLatLon()), null); | |
| StatusDisplayer.getDefault().setStatusText(mme.getLatLon().toString()); | |
| return true; | |
| } | |
| @Override | |
| public boolean mousePressed(MouseEvent e) {return true;} | |
| @Override | |
| public boolean mouseReleased(MouseEvent e) {return true;} | |
| @Override | |
| public void mouseEntered(MouseEvent e) {} | |
| @Override | |
| public void mouseExited(MouseEvent e) {} | |
| @Override | |
| public boolean mouseDragged(MouseEvent e) {return true;} | |
| @Override | |
| public boolean mouseMoved(MouseEvent e) {return true;} | |
| @Override | |
| public void mouseMoved() {} | |
| } | |
| }</pre> | |
| <p>You should notice that you have the following import statements:</p> | |
| <pre class="examplecode">import com.bbn.openmap.LayerHandler; | |
| import com.bbn.openmap.MapBean; | |
| import com.bbn.openmap.MapHandler; | |
| import com.bbn.openmap.MouseDelegator; | |
| import com.bbn.openmap.MultipleSoloMapComponentException; | |
| import com.bbn.openmap.event.MapMouseEvent; | |
| import com.bbn.openmap.event.MapMouseListener; | |
| import com.bbn.openmap.event.SelectMouseMode; | |
| import com.bbn.openmap.gui.BasicMapPanel; | |
| import com.bbn.openmap.gui.MapPanel; | |
| import com.bbn.openmap.layer.shape.ShapeLayer; | |
| import java.awt.BorderLayout; | |
| import java.awt.event.MouseEvent; | |
| import java.util.Collections; | |
| import java.util.Properties; | |
| import org.openide.awt.ActionID; | |
| import org.openide.awt.ActionReference; | |
| import org.openide.awt.ActionReferences; | |
| import org.openide.util.NbBundle.Messages; | |
| import org.openide.util.lookup.AbstractLookup; | |
| import org.openide.util.lookup.InstanceContent; | |
| import org.openide.windows.TopComponent;</pre> | |
| <p class="tips">From "share/data/shape/cntry02" in the OpenMap distribution, copy | |
| <tt>dcwpo-browse.shp</tt> and <tt>dcwpo-browse.ssx</tt> | |
| into your module. In the source code above, make sure | |
| the references to the files point to the correct location | |
| in your module.</p> | |
| </li> | |
| <li><p>Run the application, click on the map, and you will | |
| be publishing new <tt>Point2D</tt> objects into the <tt>Lookup</tt> | |
| of the <tt>TopComponent</tt>, while the status bar will also | |
| show new information whenever you click on the map:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/openmap-3.png" alt="mod 3"/></p> | |
| </li> | |
| </ol> | |
| </div> | |
| </div> | |
| <div class="indent"> | |
| <h3 class="tutorial"><a name="geotk"></a>Scenario 2: Geotoolkit</h3> | |
| <p><a href="http://www.geotoolkit.org/">Geotoolkit</a> is | |
| an open-source map technology.</p> | |
| <div class="indent"> | |
| <ol> | |
| <li>Download Geotoolkit: <a href="http://www.geotoolkit.org/download.html">http://www.geotoolkit.org/download.html</a></li> | |
| <li><p>Right-click the application's Modules node, | |
| choose Add New Library:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/openmap-1.png" alt="mod 3"/></p> | |
| <p>Then create a library | |
| wrapper module that wraps the GeoToolkit JAR file. Name | |
| the module GeoToolkiy and use <tt>org.geotoolkit</tt> as the code name base. | |
| When you complete the wizard, you should see your new module, with the Libraries | |
| node listing the GeoToolkit JAR:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/geotoolkit-1.png" alt="mod 3"/></p> | |
| <p>Next, set a dependency on the OpenMapLib module after right-clicking | |
| the Map module's Libraries node and choosing Add Module Dependency, | |
| as shown below:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/add-dep-1.png" alt="mod 3"/></p> | |
| <br/> | |
| <p>You should notice that the OpenMapLib module is now a dependency | |
| in your Map module, so that you can use the OpenMap JARs in | |
| your Map module:</p> | |
| <br/> | |
| <p><img src="../images/tutorials/air/73/geotoolkit-2.png" alt="mod 3"/></p> | |
| </li> | |
| <li>From the Geotoolkit distribution, copy | |
| <tt>Countries.shp</tt> file, as well as the DBF, PRJ, and SHX file | |
| into your module. In the source code below, make sure | |
| the references to the files point to the correct location | |
| in your module.</li> | |
| <li><p>In the MapTopComponent, use Geotoolkit as follows, as a first | |
| example to get started with your Geotoolkit/NetBeans Platform | |
| integration:</p> | |
| <pre class="examplecode">public class MyMapTopComponent extends TopComponent { | |
| @Messages("CTL_MyMapName=Map") | |
| public MyMapTopComponent() { | |
| setDisplayName(Bundle.CTL_MyMapName()); | |
| setLayout(new BorderLayout()); | |
| MapContext mapContext = MapBuilder.createContext(DefaultGeographicCRS.SPHERE); | |
| addShpData(mapContext); | |
| JMap2D map = new JMap2D(); | |
| map.getContainer().setContext(mapContext); | |
| map.setBackground(new Color(0, 150, 150)); | |
| JNavigationBar navBar = new JNavigationBar(map); | |
| add(navBar, BorderLayout.NORTH); | |
| add(map, BorderLayout.CENTER); | |
| } | |
| public void addShpData(MapContext context) { | |
| try { | |
| DataStore store = DataStoreFinder.get("url", | |
| MapTopComponent.class.getResource("Countries.shp")); | |
| Name name = store.getNames().iterator().next(); | |
| Session session = store.createSession(true); | |
| FeatureCollection fs = session.getFeatureCollection(QueryBuilder.all(name)); | |
| MapLayer layer = MapBuilder.createFeatureLayer(fs, | |
| RandomStyleFactory.createDefaultVectorStyle(fs)); | |
| layer.setVisible(true); | |
| context.layers().add(layer); | |
| } catch (DataStoreException e) { | |
| } | |
| } | |
| gsfutilities | |
| createdocument | |
| }</pre> | |
| <p class="notes"><b>Note:</b> The import statements are as follows:</p> | |
| <pre class="examplecode">import java.awt.BorderLayout; | |
| import java.awt.Color; | |
| import org.geotoolkit.data.DataStore; | |
| import org.geotoolkit.data.DataStoreFinder; | |
| import org.geotoolkit.data.FeatureCollection; | |
| import org.geotoolkit.data.query.QueryBuilder; | |
| import org.geotoolkit.data.session.Session; | |
| import org.geotoolkit.gui.swing.go2.JMap2D; | |
| import org.geotoolkit.gui.swing.go2.control.JNavigationBar; | |
| import org.geotoolkit.map.MapBuilder; | |
| import org.geotoolkit.map.MapContext; | |
| import org.geotoolkit.map.MapLayer; | |
| import org.geotoolkit.referencing.crs.DefaultGeographicCRS; | |
| import org.geotoolkit.storage.DataStoreException; | |
| import org.geotoolkit.util.RandomStyleFactory; | |
| import org.netbeans.api.settings.ConvertAsProperties; | |
| import org.opengis.feature.type.Name; | |
| import org.openide.awt.ActionID; | |
| import org.openide.awt.ActionReference; | |
| import org.openide.util.NbBundle.Messages; | |
| import org.openide.windows.TopComponent;</pre> | |
| </li> | |
| <li>Run the application and you will see your Geotoolkit map component | |
| displayed in a window in your NetBeans Platform application.</li> | |
| </ol> | |
| </div> | |
| </div> | |
| <!-- ===================================================================================== --> | |
| <h2 class="tutorial"><a name="publish"></a>Publishing and Subscribing to Objects of Interest</h2> | |
| <p>When a mouse click is performed in your map, | |
| you need to publish an object into the Lookup of the TopComponent. For example, | |
| you could publish the current Point on the map.</p> | |
| <p>In the supporting windows, you need to implement a LookupListener. When the | |
| window opens, subscribe to the Lookup of the map window, while indicating that | |
| you want to be notified when a Point is published there. Whenever a new Point | |
| is made available, you can do something with it, for example, display it in | |
| the supporting window.</p> | |
| <p>Conversely, you might need the map to be updated when one or more | |
| of the supporting windows change. In that case, the map window must | |
| be subscribed to the Lookup of the currently selected window or to | |
| the specific supporting window that it is interested in. The supporting | |
| window needs to published objects of interest to the map window.</p> | |
| <p class="tips">The <a href="https://platform.netbeans.org/tutorials/nbm-quick-start.html">NetBeans Platform Quick Start</a> describes this mechanism in detail.</p> | |
| <!-- ===================================================================================== --> | |
| <h2 class="tutorial"><a name="configure"></a>Configuring the Geospatial System</h2> | |
| <p>In this section, you learn how to change a variety of default | |
| features of the NetBeans Platform to optimize them for usage | |
| in a geospatial environment.</p> | |
| <p>All the configuration settings that follow are optional. Depending | |
| on your business needs, follow the instructions below to | |
| adapt your system to your needs.</p> | |
| <div class="indent"> | |
| <h3 class="tutorial"><a name="fullscreen"></a>Starting Up in Full Screen Mode</h3> | |
| <p>In this section, we start the application in full screen mode. Full | |
| screen mode is supported by default by the NetBeans Platform. It can be | |
| invoked by the user via View | Full Screen or by pressing Alt-Shift-Enter. | |
| However, in geospatial systems, you typically need to start the application in full screen | |
| mode automatically, so that the user will not need to take this step | |
| over and over again manually.</p> | |
| <div class="indent"> | |
| <ol> | |
| <li><p>Create a new module in the application and name it "Initializer", | |
| with code name base "org.myatc.initializer". In this module, you will | |
| provide code for initializing the application as a whole.</p> | |
| </li> | |
| <li><p>Right-click the Initializer module and choose New | Other | Module Development | Installer. Click | |
| Next and Finish.</p> | |
| </li> | |
| <li><p>Right-click the Initializer module's Libraries node, choose | |
| Add Module Dependency, then set a dependency on the | |
| File System API, the UI Utilities API, and the Window System API.</p> | |
| </li> | |
| <li><p>Define the Installer class as follows:</p> | |
| <pre class="examplecode">import javax.swing.Action; | |
| import org.openide.filesystems.FileUtil; | |
| import org.openide.modules.ModuleInstall; | |
| import org.openide.windows.WindowManager; | |
| public class Installer extends ModuleInstall { | |
| @Override | |
| public void restored() { | |
| WindowManager.getDefault().invokeWhenUIReady(new Runnable() { | |
| @Override | |
| public void run() { | |
| FileUtil.getConfigObject("Actions/Window/org-netbeans-core-windows-actions-ToggleFullScreenAction.instance", Action.class).actionPerformed(null); | |
| } | |
| }); | |
| } | |
| }</pre> | |
| </li> | |
| </ol> | |
| <p>Run the application and notice that it starts in full screen mode.</p> | |
| </div> | |
| </div> | |
| <div class="indent"> | |
| <h3 class="tutorial"><a name="undocked"></a>Starting Up in Undocked Mode</h3> | |
| <p>In this section, we reconfigure the modes in the NetBeans Platform | |
| so that the windows, except the map window, open in undocked mode.</p> | |
| <div class="indent"> | |
| <ol> | |
| <li><p>Create a layer file.</p></li> | |
| <li><p>Expand the layer file and look for the mode file.</p></li> | |
| <li><p>Change "joined" to "separated".</p></li> | |
| <li><p>Look in the layer file and see that your overrides are registered.</p></li> | |
| </ol> | |
| <p>Run the application and notice that the windows open undocked.</p> | |
| </div> | |
| </div> | |
| <div class="indent"> | |
| <h3 class="tutorial"><a name="tabs"></a>Removing Tabs</h3> | |
| <p>In this section, we remove the tabs from all the | |
| windows in the application.</p> | |
| <div class="indent"> | |
| <ol> | |
| <li><p>Set dependencies on the "Look & Feel Customization Library" | |
| and "Tab Control".</p></li> | |
| <li><p>Create a class named <code>NoTabsTabDisplayerUI</code>, with this content</p> | |
| <pre class="�xamplecode">import java.awt.Dimension; | |
| import java.awt.Point; | |
| import java.awt.Polygon; | |
| import java.awt.Rectangle; | |
| import javax.swing.DefaultSingleSelectionModel; | |
| import javax.swing.JComponent; | |
| import javax.swing.SingleSelectionModel; | |
| import javax.swing.plaf.ComponentUI; | |
| import org.netbeans.swing.tabcontrol.TabDisplayer; | |
| import org.netbeans.swing.tabcontrol.TabDisplayerUI; | |
| public class NoTabsTabDisplayerUI extends TabDisplayerUI { | |
| public NoTabsTabDisplayerUI(TabDisplayer displayer) { | |
| super(displayer); | |
| } | |
| public static ComponentUI createUI(JComponent jc) { | |
| assert jc instanceof TabDisplayer; | |
| return new NoTabsTabDisplayerUI((TabDisplayer) jc); | |
| } | |
| private static final int[] PTS = new int[] { 0, 0, 0 }; | |
| @Override | |
| public Polygon getExactTabIndication(int i) { | |
| //Should never be called | |
| return new Polygon(PTS, PTS, PTS.length); | |
| } | |
| @Override | |
| public Polygon getInsertTabIndication(int i) { | |
| return new Polygon(PTS, PTS, PTS.length); | |
| } | |
| @Override | |
| public int tabForCoordinate(Point point) { | |
| return -1; | |
| } | |
| @Override | |
| public Rectangle getTabRect(int i, Rectangle rectangle) { | |
| return new Rectangle(0,0,0,0); | |
| } | |
| @Override | |
| protected SingleSelectionModel createSelectionModel() { | |
| return new DefaultSingleSelectionModel(); | |
| } | |
| public java.lang.String getCommandAtPoint(Point point) { | |
| return null; | |
| } | |
| @Override | |
| public int dropIndexOfPoint(Point point) { | |
| return -1; | |
| } | |
| @Override | |
| public void registerShortcuts(javax.swing.JComponent jComponent) { | |
| //do nothing | |
| } | |
| @Override | |
| public void unregisterShortcuts(javax.swing.JComponent jComponent) { | |
| //do nothing | |
| } | |
| @Override | |
| protected void requestAttention(int i) { | |
| //do nothing | |
| } | |
| @Override | |
| protected void cancelRequestAttention(int i) { | |
| //do nothing | |
| } | |
| @Override | |
| public Dimension getPreferredSize(javax.swing.JComponent c) { | |
| return new Dimension(0, 0); | |
| } | |
| @Override | |
| public Dimension getMinimumSize(javax.swing.JComponent c) { | |
| return new Dimension(0, 0); | |
| } | |
| @Override | |
| public Dimension getMaximumSize(javax.swing.JComponent c) { | |
| return new Dimension(0, 0); | |
| } | |
| }</pre> | |
| </li> | |
| <li><p>Add to the restored method in the installer:</p> | |
| <pre class="examplecode">UIManager.put("ViewTabDisplayerUI", "org.myatc.initializer.NoTabsTabDisplayerUI"); | |
| UIManager.put("EditorTabDisplayerUI", "org.myatc.initializer.NoTabsTabDisplayerUI");</pre> | |
| </li> | |
| </ol> | |
| <p>Run the application and notice that the tabs are removed.</p> | |
| </div> | |
| </div> | |
| <p>Congratulations! At this stage, with very little coding, | |
| you have created the starting point of an air-traffic control system.</p> | |
| <p class="tips"> To continue learning about the NetBeans Platform, head on to | |
| the four-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> |