Aug 012014
 

Beans binding makes life so much easier when designing GUIs with the NetBeans IDE. It is well integrated into the GUI builder, and usually it just works out of the box.

Last week I developed a new options panel for a NetBeans Platform Application. Creating the framework for the new panel took maybe a minute using the file wizard that sets up everything for you to link the panel to the Options infrastructure of the Platform. I added a text field or two, and bound their text properties to a bean that I had created for this purpose. When I ran the application, I saw that the binding didn’t do anything at all!

So I dived into the source code of the beansbinding library. I debugged through lots and lots of source code – first in a plain old Java application where the binding did work as expected, and then in the platform application that was giving me trouble. I spent maybe an hour and a half deep down in the depths of that library. And then suddenly I found the source of my problem! If you look carefully at the source code in the NetBeans Options Window Module Tutorial, and knew what you were looking for, this like would jump out at you:

final class CoolOptionsPanel extends javax.swing.JPanel {

The cause of my trouble is that this panel class is NOT public! In retrospect, this makes a lot of sense. Beans binding does a lot of operations via reflection, and if the class is not public the library won’t have access to it!

Tip of the month
For beans binding to work with any GUI panel, that panel must be public!
Nov 302013
 

The NetBeans IDE has some great refactoring tools. It makes lots of tasks so much less error prone than doing them manually. In this article, I describe some of my favourite refactoring tools. (These tools can be accessed from the main menu bar (Refactor) or from the context menu of a Java file open in the editor.)

#1 – Rename

Anything that has a name can be renamed. But my favourite example is renaming a class.

refactor01

 

When a class is renamed, not only the source code of the class (optionally including comments) is changed, but also the name of the file where it lives. And also any usages of the class elsewhere in your open projects!

#2 – Encapsulate Fields

This feature allows you to generate getters, setters and property change support for fields in a class. It allows you to specify various parameters, such as the visibility of the accessors. So lets take a very simple class, and apply the Encapsulate Fields tool:

refactor02

 

… and lets look at the generated code:

refactor03

 #3 – Extract Interface

If you have an existing class, and you want to extract some of its methods into an interface, the NetBeans IDE has just the tool for you!

refactor04

 

Not only does the interface get generated, but your class is automatically changed to implement the new interface too!

refactor05

#4 – Introduce Method

Sometimes one wants to extract some lines of code into a separate method. Maybe because the initial method is becoming too long to be readable, or because that part of the functionality will be reused elsewhere. Whatever the motivation, the NetBeans IDE has just the tool for the job! So lets look at a silly example where an identical piece of code occurs twice in the same class:

refactor06

And then lets look at the result of the refactoring:

refactor07

Tip: Experiment with extracting large, complicated blocks of code – the NetBeans IDE is capable of much more than this simple example!

#5 – Change Method Parameters

Say we decide to now introduce a new parameter for the extractedMethod() created above. If we did this manually, it would mean changing each place where the method is called manually too. (Sometimes this is desirable, but it can be a lot of effort.) With the Change Method Parameters feature, this task becomes much easier, since it allows you to specify a default value for the new parameter.

refactor08

Now our class looks like this:

refactor09

Tip: Also try out the Create New Method and Delegate from Existing Method option!

Nov 152013
 

The NetBeans IDE has so many wonderful features that makes a Java developer’s life easier. And many of these features have keyboard shortcuts attached to them. So I decided to make a list of the shortcuts that I think every developer should know.

  • Ctrl+O : Quickly go to a class
    This shows a dialog that allows you to start typing the name of the class that you are looking for. You can then choose the class from a list of matched names.
  • Ctrl+Shift+I : Fix imports
    Add any new imports that are necessary and remove unused ones at the same time. If a class name matches multiple possibilities, a dialog is displayed that allows you to choose which class to import.
  • Alt+Shift+F : Format selection
    Format the selected code according to the rules that can be changed in the IDE Options > Editor > Formatting. This is also a handy way to format XML in a useful way.
  • Alt+F7 : Find usages
    Find where the currently selected type is used.
  • Ctrl+R : Rename
    Rename the selected variable or class, refactoring if required.
  • Alt+Insert : Generate code
    Choose from various context sensitive items that the IDE can generate, for example generating getters and setters.
  • Ctrl+Space : Auto complete
    Context sensitive auto complete.
  • Ctrl+/ : Toggle comment lines
    Adds // to the start of each of the selected lines. Or removes these if present.
  • Ctrl+Shift+Up/Down : Copy lines up/down
    Make a copy of the currently selected lines, without going through the clipboard.
  • Alt+Shift+Up/Down : Move lines up/down
    Move the currently selected lines, without going through the clipboard.

For a much more comprehensive list of keyboard shortcuts, have a look at Highlights of NetBeans IDE 7.4 Keyboard Shortcuts & Code Templates.

Sep 022013
 

Creating a wizard in a NetBeans Platform Application is quite easy since there is a NetBeans IDE new file wizard that creates all of the scaffolding for you. Have a look at the NetBeans Wizard Module Tutorial for a step by step description of how to work with the normal, modal wizards.

In the above tutorial, the DemoWizardAction class contains the sample code for calling the wizard. The relevant code for displaying the modal wizard is duplicated below for easy reference:

WizardDescriptor wiz = new WizardDescriptor(
        new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) {
    // do something
}

I recently ran into a use case where it was required that the wizard must be non-modal. Whether this is a desirable behaviour for a wizard is a topic all of its own, so lets just assume that we want to be able to do this. The code to display the wizard as non-modal is shown below:

WizardDescriptor wiz = new WizardDescriptor(
        new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
Dialog wizardDialog = DialogDisplayer.getDefault().createDialog(wiz);
wizardDialog.setModal(false);
wizardDialog.setVisible(true);

Now the remaining complication is being able to catch the event that indicates that the wizard completed with the option WizardDescriptor.FINISH_OPTION as in the original code. I noticed that the WizardDescriptor allows for the registration of property change listeners. And so by debugging into the propertyChange method, I was able to determine what must be handled to catch this particular event:

WizardDescriptor wiz = new WizardDescriptor(
        new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
wiz.addPropertyChangeListener(new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getNewValue() != null && "org.openide.WizardDescriptor.FinishAction".
                 equals(evt.getNewValue().getClass().getCanonicalName())) {
            // do something
        }
    }
});

Dialog wizardDialog = DialogDisplayer.getDefault().createDialog(wiz);
wizardDialog.setModal(false);
wizardDialog.setVisible(true);
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!