blob: a05e654377aa9f321b83a83028bdcdb7e4bb0aef [file] [log] [blame]
<!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/74/netbeans_stamp_74_73_72.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 7 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>