Jun 212013
 

In the previous blog post, some areas remained unexplored. Specifically, how to observe the values of variables with versions of the IDE that don’t include debug information. In this guest post by Robert Bracko (robert [dot] bracko [at] vip [dot] hr), he describes his experiences with building the NetBeans IDE source code to overcome this obstacle.

Step 1: Building NB sources

  1. Create local disk folder C:\nb6_9_1

  2. Download NB platform sources (netbeans-6.9.1-201007282301-src.zip) and extract it into C:\nb6_9_1\src

  3. Download NB binaries (netbeans-6.9.1-201007282301-ml-javase.zip). This step is necessary for getting the appropriate Ant builder. Extract only netbeans\java\ant into C:\nb6_9_1\ant. Result of that operation should be that C:\nb6_9_1\ant contains ant subfolders binetcextralib

  4. Create batch file (buildenv.bat) inside the folder C:\nb6_9_1. Put the following lines (adjust JAVA_HOME to match your Java JDK path!):
    set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_12
    set ANT_HOME=C:\nb6_9_1\ant
    set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%PATH%
    set ANT_OPTS=-Xmx1g

  5. Open command shell and change directory to C:\nb6_9_1. Execute buildenv.bat. Then change directory to NetBeans source which is to be built (C:\nb6_9_1\src). Execute ant (without any cmd-line params). Please be patient; depending on your machine power, the process can take up to hour!

As a result of above-described procedure, new folder is created: C:\nb6_9_1\src\nbbuild.

General notes

  • For some reason, path of Ant installation directory must not contain spaces!
  • If building for the first time, disable Windows Firewall because for some reason it prevents Ant from downloading jars from web.
  • Possible build error “java.lang.OutOfMemoryError” can be overridden by following batch command: set ANT_OPTS=-Xmx1g

Note on building NB 6.9.1 sources:

During build process, you will probably encounter the following error:
C:\nb6_9_1\src\o.jruby.distro\unpatched_source\jruby-1.5.0\build.xml:1141: Java returned: 1

Please check https://netbeans.org/bugzilla/show_bug.cgi?id=186736 for a workaround.

Step 2: Debugging specific NB platform and/or NB module that was developed for that platform

Open your development IDE (in my case, it’s NB 7.3).
There are two possible ways to debug NB module that was developed for specific NB target-platform (in our case, it’s for NB 6.9.1). I prefer the first one ("Adding target platform through NetBeans Platform Manager") because it’s not necessary to install NBM inside target-IDE.

  1. Adding target platform through NetBeans Platform Manager

    1. Choose from main menu Tools > NetBeans Platforms. Press button “Add Platform…”. Choose the folder C:\nb6_9_1\src\nbbuild\netbeans. Let NB decide on the name of platform (“nb691”).

    2. Choose tab “Sources” and add the following folder: C:\nb6_9_1\src

    3. Choose tab “Harness” and check whether radio-button “Harness supplied with Platform” is selected

    4. Open your NBM project.
      The following is important! Open Project Properties > Libraries and adjust the field “NetBeans Platform” to hold the value nb691!

    5. Set the breakpoint inside your NBM code.

    6. Optionally, you can set the breakpoint inside NB platform source code. For instance, let’s imagine that your NBM uses functionality of NB class AbsoluteLayoutSupport and you want to check the interaction. Make a Windows file-search inside the folder C:\nb6_9_1\src. That results in containing folder C:\nb6_9_1\src\form\src\org\netbeans\modules\form\layoutsupport\delegates. So open the folder C:\nb6_9_1\src\form as another project in your development-IDE(uncheck the checkbox “Open Required Projects:”). Expand Projects window node Form Editor > Source Packages > org.netbeans.modules.form.layoutsupport.delegates. Double click on AbsoluteLayoutSupport.java and set the breakpoint.

    7. Inside Projects window, right click on your NBM and choose Debug from the context menu. That makes target-IDE (6.9.1) to launch. Choose Tools > Plugins from target-IDE main menu, then choose tab “Installed”. You should see your NBM inside the list of installed plugins. Nice, isn’t it?

    8. Make some action that affects your NBM and enjoy debugging 🙂

  2. Opening src\nbbuild as a project

    1. Open your NBM project and set the breakpoint anywhere inside the code.

    2. Open the following folder as a project: C:\nb6_9_1\src\nbbuild. The node “NetBeans Build System” appears inside Projects window.

    3. Right-click the subnode build.xml and choose the following from context menu: Run Target > tryme-debug. That makes target-IDE (6.9.1) to launch. Choose Tools > Plugins from target-IDE main menu, then choose tab Downloaded. Press button “Add Plugins…”, find NBM on disk and then press button “Install”. Finish the installation process, then close Plugins window.

    4. Make some action that affects your NBM and enjoy debugging 🙂

    5. Optionally, you can set the breakpoint inside NB platform source code. Follow the same approach as given in “Adding target platform through NetBeans Platform Manager” step 6.
Jun 072013
 

Much has been written about the NetBeans Platform. But the ultimate resource still remains the source code of the Platform itself! I have used plenty of open source libraries over the years. And I have ventured into the source code numerous times. Quite often the experience is one that leaves one dazed and confused. But I have found that the NetBeans source code is well structured and easy to follow. So even on your very first adventure, you can gain much wisdom! 🙂

Reading source code is like reading a Physics text book. You can try to keep all of that information in your head, or you can experience it in practice. So in most cases, the easy way to find an answer is to debug into the source instead of just perusing it.

How to set up the source code to be able to debug into it, depends on what type of project you are working with. For Ant-based module projects, download the source code of the same version as the platform that you are building on, and configure the platform to use it in the NetBeans Platform Manager (Tools > NetBeans Platforms). This gives you access to all of the source code in all of the modules.

For Maven-based projects, you have to attach the source code for each of the dependencies. In project view, right-click on one of the NetBeans module dependencies and choose Download Sources.

Now put a breakpoint somewhere in your own module to start from. So for example, if you wanted to explorer the behaviour of the TopComponent class, put a breakpoint into the constructor of a TopComponent subclass (created using the Window wizard). And step into for example the setName() method.

Using this methodology, you can explore how the platform loads and uses things like nodes and actions and windows. That will provide you with much deeper insight into how these things work!

Robert Bracko (robert [dot] bracko [at] vip [dot] hr) explored the behaviour of an old third party IDE module from the 6.9.1 days. He sent me the following points, describing his fascinating first adventure!

  1. Downloaded NB 6.9.1 (Build Type: Release) from https://netbeans.org/downloads/6.9.1/zip.html:
    1. netbeans-6.9.1-201007282301-ml-javase.zip (description: NetBeans 6.9.1 Java SE OS Independent Zip/English)
      Extracted (not installed!) into directory netbeans-6.9.1-201007282301-ml-javase
    2. netbeans-6.9.1-201007282301-src.zip
      Extracted into directory netbeans-6.9.1-201007282301-src
  2. Inside Development IDE (NB 7.3), added platform nb691 as new NB platform, based on directory netbeans-6.9.1-201007282301-ml-javase\netbeans.
    Sources linked for that platform, based on directory netbeans-6.9.1-201007282301-src
    So far so good 🙂
  3. Project opened inside Development IDE: KoalaLayoutSupport. Project properties changed: NetBeans platform set to nb691
    Attempt to build the project fails:
    The following error occurred while executing this line:
    X:\netbeans\netbeans-6.9.1-201007282301-ml-javase\netbeans\harness\testcoverage.xml:22: C:\Program Files\NetBeans 7.3\harness\testcoverage\cobertura does not exist.What is strange here is that error message refers to C:\Program Files\NetBeans 7.3 directory. Why does it look into NB 7.3 installation directory?
    Next step was to investigate exactly what’s going on during build process. So I’ve selected project’s node Important Files > Build Script and from the pop-up menu chose Debug Targer > netbeans. I found out that file nbproject/build-impl.xml refers to file nbproject/private/platform-private.properties which further defines property user.properties.file with value C:\\Documents and Settings\\Administrator\\Application Data\\NetBeans\\7.3\\build.properties. Nothing wrong with that, right? Because at the same time debugger’s variables-window shows that property nbplatform.active contains value nb691, so the whole process of building should be (at least I think so) controlled by NB 6.9.1. platform.
    But then one suspicious thing: build-impl.xml tries to define the property harness.dir with value nbplatform.${nbplatform.active}.harness.dir. After having executed that line, debugger’s variables-window shows the value C:\Program Files\NetBeans 7.3/harness for that variable! And that’s obviously wrong.
    So the next step was to change harness dir for platform nb691. I have done that through NB Platform Manager: inside tab Harness, choosing “Harness supplied with Platform” instead of “Harness supplied with IDE”. And then the build passed OK! 🙂
  4. Next thing, module debugging. Breakpoint set inside of module’s class works OK, also a breakpoint set inside of a class of NB 6.9.1 source. But… For the latter one, debugger’s variable window shows the error message “variable information not available, source compiled without -g option”. I know what it means but how to resolve it?….. For me it’s rather important to see how NB Form Editor source code interact with my module…

Thanks for sharing, Robert! Some questions still remain unanswered in the steps above. Stay tuned for more about his next adventure!

Apr 242013
 

The NetBeans IDE’s debugging tools is one of maybe the top 5 features that I simply cannot live without! And as you can imagine, debugging is something I do quite regularly. So I was rather surprised when I only recently discovered an AWESOME feature that has been around for a long, long time. 🙂 This feature is Variable Formatters.

To explain what a Variable Formatter is, some context is required. So lets have a look at the Variables window while debugging a very simple little Java application.

Variables Window

Variables Window

That is a pretty useful view. I can see all the variables that I could possibly need at a glance. (Of course, that is easy with an application this simple.) Of interest to this particular discussion, however, is the Value column. Notice how the various types have different string representations that are displayed. Now lets create a simple class called SomeObject:

public class SomeObject {

    private String var1;
    private String var2;

    public SomeObject(String var1, String var2) {
        this.var1 = var1;
        this.var2 = var2;
    }

    public String getVar2() {
        return var2;
    }
}

and create an ArrayList filled with SomeObjects, to inspect in the debugger:

ArrayList in the Variables Window

ArrayList in the Variables Window

Each of the elements in the list can of course be expanded to see the details. But what if you were looking for a specific element in a very long list? The great news is, that Variable Formatters allows us to customise how these items are displayed! From the main menu, select Tools > Options. Choose the Java page, and then the Java Debugger tab, Variable Formatters category.

Variable Formatters options

Variable Formatters options

A number of formatters are already specified, but we can add a custom one:

Custom Formatter

Custom Formatter

And very impressively, it gets applied immediately when you click OK on the options dialog! Even while the debugger is running! Now the display looks like this:

Customised Display

Customised Display

Suddenly ANY type of variable can have a user friendly, and customised, presentation in the variables window!

Mar 282013
 

The success of a software development project can be measured in many ways. But certainly one of the most important metrics for the users of open source software, is the quality of the software itself. And so it is fitting that the second interview in the series of NetBeans team interviews introduces Marián Mirilovič, NetBeans Quality Engineering Manager.

Marián Mirilovič at Edinburgh Castle, Scotland

Marián Mirilovič at Edinburgh Castle, Scotland

Hermien Pellissier: How long have you been a part of the NetBeans team?

Marián Mirilovič: Actually I was hired into the original NetBeans team (before it was bought by Sun Microsystems) in July 1999, but just a few days before my start date I got call-up and I was forced to spend one year in a Slovak Army base camp. Fortunately I got another offer from the team just before the end of my duty, so my official start point is November 2000. Wow… looking at the date now, it is almost 13 years and most of them unforgettable (especially those at Sun Microsystems).

HP: What is your role in the team?

MM: My actual position is “NetBeans Quality Engineering Manager”. So beside leading the QE team, I am also the one responsible for the final quality of the product, setting expectations in quality area for new releases and getting buy-in to new Quality Criteria by the Development team (the toughest part of my job).

HP: What is a typical work day like for you?

MM: It depends on the phase of the release cycle. But more or less I start with reading emails as we are an international company, and most of my colleagues work in different time-zones, so I usually get replies during my nights. Emails usually give me an updated picture what the status is, if there is a blocker for my team to continue in the activity we are currently working on. When everything goes well, I check the dashboard and go through high-priority bugs reported since my last check. Continue with meetings and tasks connected with the phase of the release cycle we are working on that day. Just before leaving office I do check the dashboard, what was the income in a day and other stats.

HP: When is the Quality Engineering team at its busiest?

MM: The whole season ;). Actually, there are a couple days after releasing new version when we have “a free time”, but after a day or two we start to work on a first patch, so there are almost no down-times.

HP: Which aspect of your job do you enjoy the most, and why?

MM: There are three peaks for me ;). The first one is when we complete testing of a new version and I am proud to send “GO” for a release.

The second is when we are getting replies to our “Thanks for your contribution to the NetBeans X.Y” emails and people thank us for a great IDE and appreciate the work we’d done during the whole release cycle.

And the last one is when we send recognition awards to the most active NetCAT participants. Actually this is usually the last task on the checklist for particular release. 😉

HP: What are your other interests?

MM: First of all my children. I have a four and a half year old daughter and a seven year old son. Both are very active and require a lot of attention. 😉

The other important thing in my life is sport. I play ice-hockey, beach volleyball, and I like jogging in summer and skiing in winter.

HP: What is your favourite holiday destination?

MM: We are used to spending our summer holidays on one of the Greek Islands. The other usual place is the area under High Tatras in Slovakia (my birthplace) and the last one is Lake Lipno in the Czech Republic.

HP: What is your favourite show or movie?

MM: I like the Sci-Fi genre and movies about history. I have read plenty of Isaac Asimov and Arthur C. Clarke’s books. There are a lot of movies I like. The first two that come to my mind just because I saw them recently are “Invictus” and “Moneyball”.

HP: Are there any blogs (NetBeans related or otherwise) that you would recommend?

MM: I like Geertjan’s Blog (https://blogs.oracle.com/geertjan/) and I strongly recommend reading it. Also NetBeans’ PHP blog (https://blogs.oracle.com/netbeansphp) is pretty active and keeps our huge PHP community updated.

HP: Thank you for the interview!

Mar 112013
 

NetBeans is an IDE, a platform, and a community. And the full time NetBeans team at Oracle plays a very important role in all of that. However, the people that does all the great work are also very modest about their accomplishments. And so the community doesn’t know all the interesting people that are involved and what they do every day. This is the first in a series of interviews with the various team members, to introduce them to the community. Today I am priviledged to introduce Jiří Kovalský.

Jiří Kovalský on vacation in the Jizerske hory mountains

Jiří Kovalský on vacation in the Jizerske hory mountains

Hermien Pellissier: How long have you been a part of the NetBeans team?

Jiří Kovalský: I am proud to work for the NetBeans project already since July 2000 so it will be 13 years this summer! Being part of one team for such a long time has both good and bad aspects. On one side you watch the fantastic progress of the project while on the other hand it also brings sad moments like seeing your good friends leaving the road you walked together for years.

HP: What is your role in the team?

JK: I am actually sitting on two chairs. My job title reads “NetBeans Community Manager” so I should be managing NetBeans community but I prefer to call it cooperation or coordination at maximum rather than any kind of management. In open source world people contribute voluntarily, right? NetBeans has a huge community which by the way reached 1.3 million active users last year and it’s logical that there are many people who want to give something back for the free tool they use daily. So, I for example try to do my best to help those active users contribute where it makes sense and coordinate such efforts to maximize productivity.

You might have probably heard of NetCAT program which is now an essential part of the NetBeans stabilization phase. Imagine there are ~100 NetCAT participants who test NetBeans development builds. Such a crowd needs a bit of coordination to distribute the work load, you must provide clear instructions to avoid misunderstandings and of course empathy is handy too. And that’s my job.

Besides NetCAT, I for example “manage” team of Plugin Verifiers. These are volunteers who constantly test NetBeans plugins which aim to the NetBeans Update Center. I am also responsible for processing Oracle Contributor Agreements.

HP: And what’s the other chair?

JK: Secondly, I am member of the NetBeans Quality Engineering team responsible for Java/Ant Debugger and JUnit/TestNG support. This includes testing these features, reporting bugs, updating test specifications or maintenance of automated tests. Since the beginning I have been also involved in design of the Plugin Portal so I feel responsibility for that web too.

HP: What is a typical work day like for you?

JK: Firstly, I must explain that I work from home 4 days a week. Since I live in a small town called Bohumin, I travel to the office in Prague every other week for two days.

I wake up at 6:00 AM, make some tea and prepare a breakfast for kids. Then I wake them up and prepare my breakfast and a snack for the children. At 7:30 we drive to school. On my way home I sometimes do some shopping. After my return from the school I finally turn on my computer. Yes, its uptime is 24 hours at maximum. 🙂

I know some mentors would disagree with it but I start my working hours by reading e-mails. Being the NetBeans Community Manager I have to communicate a lot and morning is the perfect time to resolve things from those community members who live on the other side of the Earth. Requests from those in my time zone or near enough can wait till the afternoon, can’t they? 🙂 I dedicate ~1 hour to e-mails and then switch to the most important task planned for the day. This can be for example testing latest NetBeans IDE and JDK bundles, calculating activity of NetCAT participants, searching for new plugins to be featured on the web site, verification of bug fixes planned to an update release, writing a speech for an online chat with community members or stabilization of Debugger sanity automated test suite.

Around noon I eat lunch in advance cooked by my wife or prepare something myself. One of my bad habits is reading Facebook or some newspapers during lunch. 🙂 In the afternoon I again check my e-mails and try to fully clear my Inbox. Then I sometimes prepare for meetings if there are any. If not, I switch to another priority task on my Todo list. Typically it concerns some communication with NetBeans community which needs concentration and time. I am not fan of multitasking so I prefer finishing my task at all costs before going further. Downside of this approach is that I sometimes end my day with more duties than I had in the morning.

At 4:30 PM I often interrupt my work and drive for kids and wife. If there is something critical I continue working in the evening when our house goes silent. This happens when I for example write a NetCAT status report which takes around 6 hours in total. I try to shutdown my computer no later than 10:30 PM. Just out of curiosity, in 2012 I spent 18.9% with e-mails, 28.4% with NetCAT or 14.3% on testing.

HP: Which aspect of your job do you enjoy the most, and why?

JK: You know what’s exciting? That so many different people from variety of cultures with almost no chance to meet in person cooperate together to build a better product. I like that although I am just a tiny bit in this big puzzle I can make a difference. Just as anyone who feels strongly about NetBeans too. That’s what I like about my job.

HP: Which new NetBeans feature(s) are you most excited about?

JK: How many you want to hear? Just one? 🙂 Oh, it will be difficult. So, just briefly:

7.3: New web client development support and the integration with Chrome is simply amazing.
7.2: Background indexing using transactions which lead to vastly increased performance.
Overall: It may sound stupid but I like small Editing features like Hippie Completion (Ctrl+K), regular expressions in Find & Replace tool and Macros. These are some quite good time savers.

HP: What are your other interests?

JK: First of all family comes to my mind. I like to spend my time with my wife and kids. I like reading books for Ondrej (6 years old son), I like listening to Zuzana (8 years old daughter) playing violin, I like programming with Barbora (10 years old daughter) and of course I like for example skiing or going to a theatre with my wife.

Sport is significant for me in general. I am especially keen on playing volleyball (Fridays) and squash (bi weekly). I do weights once a week. I am also kind of interested in arts – I collect old paintings for instance. I don’t have any from Pablo Picasso or Claude Monet yet 😀 but these were really great painters.

HP: Which movie/book genre(s) is/are your favourite(s)?

JK: I know it is scary but I don’t read books. I am sure though I will enjoy it when I retire. 🙂 However, I like Sci-fi genre which fascinated me when I first saw the Aliens movie by James Cameron in 1988. The Matrix from 1999 was another hit and recently I liked Avatar a lot from 2009.

HP: What is your favourite holiday destination?

JK: I don’t have any concrete preference but since the Czech Republic is a landlocked country I like for some reason sea, waves and the fresh air. My wife prefers mountains so we made a compromise and go to mountains one year and fly to some coast next year. 🙂

HP: Are there any blogs (NetBeans related or otherwise) that you would recommend?

JK: I don’t watch blogs much but Geertjan’s blog keeps surprising me with its useful content and has the most hits in my browser’s history. Otherwise I am happy subscriber of PHD Comics by Jorge Cham. It’s not only entertaining but educative at the same time.

HP: Thank you very much for the interview!

Dec 192012
 

The open space on the menu bar of a NetBeans Platform application is often wasted. In the NetBeans IDE, the quick search bar is positioned in that handy location. And your application can have that too of course. However, the question was raised on the forums recently how one would go about adding your own component there. Here is the promised post explaining the steps in detail. The result will look like the screenshot below, with the new User label introduced in the space where the quick search would have been.

Screenshot showing the standalone module running in the IDE

Screenshot showing the standalone module running in the IDE

Step 1: The Module. We need a NetBeans Platform module to work with. So if you don’t have one yet, create one now. It can be either a standalone module or exist as a part of a suite. I created a standalone module. When you run a standalone module, it basically gets installed into an instance of the IDE. That is why the screenshot shows all the bits of the IDE.

Step 2: The Component. Create a new JPanel form (I called mine CustomComponent) and add a JLabel to it. Specify and icon for the label if you wish. The important point to take note of is that you need to specify a size for the panel (resize it in the GUI builder) and then specify that same size as the minimum and maximum size of the panel too. Otherwise the size of the panel will not be what you expected.

Custom component in the GUI builder

Custom component in the GUI builder

Step 3: The Action. Just as the NetBeans IDE 7.2 Plugin Quick Start tutorial describes, create a new Action. Just as the tutorial describes, choose Global Toolbar Button on the GUI Registration page (this will be changed later). Change the action to extend from AbstractAction and implement Presenter.Toolbar, all still as in the tutorial. And in the getToolbarPresenter() method return an instance of CustomComponent.

Then change the @ActionReference annotation’s path to just be “Menu” and position to be 10000.

So at the end of this step we now have the action class below.

import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.util.NbBundle.Messages;
import org.openide.util.actions.Presenter;

@ActionID(category = "Build",
id = "za.co.pellissier.componentinmenubar.CustomComponentActionListener")
@ActionRegistration(
displayName = "#CTL_CustomComponentActionListener")
@ActionReference(path = "Menu", position = 10000)
@Messages("CTL_CustomComponentActionListener=CustomComponent")
public final class CustomComponentActionListener
extends AbstractAction implements Presenter.Toolbar {

@Override
public void actionPerformed(ActionEvent e) {
}

@Override
public Component getToolbarPresenter() {
return new CustomComponent();
}
}

Step 4. Alignment. In order to force the component to be right-aligned, we can add a spacer just to the left of it. Here the NetBeans Quick Search Integration Tutorial has a handy example (in the very last section). Create an XML Layer file in your module. The file should be opened on creation. Now add a spacer like in the tutorial, resulting in the layer.xml file looking like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
    <file name="Spacer.instance">
        <attr name="instanceCreate" methodvalue="javax.swing.Box.createHorizontalGlue"/>
        <attr name="position" intvalue="9999"/>
    </file> 
</filesystem>

Note the position of 9999, which is just to the left of the 10000 of the component.

Step 5. Hiding Quick Search. In practice you could have the quick search and your own component next to one another. However, for the purpose of this tutorial I decided to hide the quick search feature. Modify the layer file once more, so that it looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
    <folder name="Menu">
        <file name="org-netbeans-modules-quicksearch-QuickSearchAction.shadow_hidden"/>
    </folder>
    <file name="Spacer.instance">
        <attr name="instanceCreate" methodvalue="javax.swing.Box.createHorizontalGlue"/>
        <attr name="position" intvalue="9999"/>
    </file> 
</filesystem>

That is it. Now you have a custom component being displayed in the empty space on the menu bar.

Nov 212012
 

Today I was working again on the undocked TopComponent that inspired the post Hiding Tabs for Undocked TopComponents, this time adding a custom statusbar to it. And in the process I found a way of adding a banner to a NetBeans Platform application. There might be unexpected side effects with layout, but so far it looks good. 🙂 Here is what my sample application looks like, to explain what I mean by ‘banner’ (the green part in the screenshot).

Sample application with banner

Sample application with banner

Well, as far as I gather the idea is not brand new. I had a hint from a forum thread that helped to point me in the right direction. Toni mentions there that you can add components outside the control of the window system, but the blog post linked to there no longer exists…

I started by browsing through the GUI elements in debug mode. And I soon found out that by calling

((JRootPane) WindowManager.getDefault().getMainWindow().
        getComponents()[0]).getContentPane()

you can find the main panel that contains all the GUI elements. And this panel has a BorderLayout. So lets look at the different parts of the NetBeans IDE as contained in this window to illustrate.

NetBeans IDE showing layout areas

NetBeans IDE showing layout areas

I created a normal JPanel form (I called mine BannerPanel) and added the components that you see on the screenshot to it. Then I created an installer class for the module, and into the restored method I put the following code:

WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
    @Override
    public void run() {
        Frame mainWindow = WindowManager.getDefault().getMainWindow();
        Container contentPane = 
                ((JRootPane) mainWindow.getComponents()[0]).getContentPane();
        BannerPanel banner = new BannerPanel();
        contentPane.add(BorderLayout.NORTH, banner);
        ((BorderLayout) contentPane.getLayout()).
                invalidateLayout(contentPane);
        mainWindow.validate();
    }
});

Now you will notice that I am putting the panel into BorderLayout.NORTH, which according to the screenshot earlier is where the toolbar already is. What is in fact in that space is a container panel that keeps the space for the toolbar. So replacing it means that the panel actually starts at the same height as the toolbar. And this means that you need to leave some open space at the top of the panel that you design. See the screenshot below showing my very green form in the GUI designer.

Banner in GUI designer

Banner in GUI designer

One last gotcha. You have to specify a height for the form by re-sizing it with the GUI designer. Otherwise the form will end up being small enough to be hidden behind the toolbar.

And remember – this is a way to bypass the NetBeans Platform window system to add components around it. So if things go wrong, you will have to go on a quest to find a Swing guru… 🙂

Nov 162012
 

Today I set out to accomplish something that appeared to be quite simple. However, it took me quite a few hours and lots of reading to find a solution. I do hope that this will be useful to other developers!

I have been working a JPanel form with a lot of different components on it, including JTextFields, JDateChoosers and some custom Swing components. And today I wanted to exclude some of the controls from the tab order. The controls I wanted to exclude were enabled but set as not editable, to allow the user to copy the values as required.

The first thing I tried was setting the components as not focusable. However, that meant that I couldn’t select the text with the mouse pointer anymore. So back to the drawing board.

I moved on to reading about the FocusTraversalPolicy mechanism (which I have never used before). And after much trial and error, I found this very simple solution. Just extend the class LayoutFocusTraversalPolicy, overriding the accept method as required. Here is the newly created class:

public class ExclusionFocusTraversalPolicy 
        extends LayoutFocusTraversalPolicy {

    private ArrayList components = new ArrayList();

    public void addExcludedComponent(Component component) {
        components.add(component);
    }

    @Override
    protected boolean accept(Component aComponent) {
        if (components.contains(aComponent)) {
            return false;
        }
        return super.accept(aComponent);
    }
}

And then in the form after adding the components call:

ExclusionFocusTraversalPolicy policy = new ExclusionFocusTraversalPolicy();
// add all the desired components to the exclusion list
policy.addExcludedComponent(textField);
setFocusTraversalPolicy(policy);
setFocusTraversalPolicyProvider(true);

That is it. Now when tabbing through the form, all the components in the exclusion list are skipped!