What are some of the hooks in the application’s lifecycle I can plug into?
One major difference between developing a Platform application and a monolithic Java application is that there is no main
method. This sometimes leaves developers wondering where they can insert their own code. This FAQ entry describes some places where this is possible.
Although a bit drastic for most cases, you can replace the main class used to start NetBeans (xdoc:DevFaqPlatformAppAuthStrategies.adoc[DevFaqPlatformAppAuthStrategies]) with your own class and then delegate back to NetBeans' normal main class. This offers you a hook early in the startup sequence without having to modify the launchers or shell scripts.
Any module may provide a ModuleInstall implementation. The validate
method will be called before your module is even loaded, so it is the first module-level hook available in the startup sequence. Note that many services and classes offered by the platform are unlikely to be initialized at this point.
A short time afterwards, the restored
method will be called on each ModuleInstall
class.
More services and classes will be initialized at this point than with the validate
method, but the GUI will probably not yet be realized.
You can post some code to be executed when the UI is fully loaded like this:
@Override public void restored() {
WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
public void run() {
// any code here will be run with the UI is available
SomeTopComponent.findInstance().open();
}
});
}
The ModuleInstall
class offers two methods which let you plug into the exit sequence.
The closing
method is called first and requires that you return a boolean value.
If true
, then your module agrees to be closed,
but if false
, then you will prevent the exit sequence from continuing.
The close
method is called after all ModuleInstall
classes return true
from the closing
method
and is the final hook in which modules can participate in the application’s lifecycle.
Note that providing a ModuleInstall
class will increase total startup time a little,
even if you have taken care to execute any long-running tasks from its methods in a background thread.
It is always preferable to register objects declaratively,
and/or run procedural code when it is first needed rather than eagerly.
Another major class in platform development is the TopComponent class. It offers several methods which allow you to hook into its lifecycle.
Here are some events you can hook into for when a TopComponent
is opened:
-
JComponent.addNotify
-
TopComponent.componentOpened
-
TopComponent.componentShowing
-
TopComponent.componentActivated
When you set focus on a TopComponent
, the componentActivated
method is called.
Likewise, the componentDeactivated
method is called when focus is moved away from that TopComponent
.
Here are some events you can hook into for when a TopComponent
is closed:
-
TopComponent.canClose
-
JComponent.removeNotify
-
TopComponent.componentHidden
-
TopComponent.componentDeactivated
-
TopComponent.componentClosed
(The exact sequence in which the opening/closing hooks are invoked is not documented or guaranteed to remain constant.)
Note that you can return false
from TopComponent.canClose
to prevent the TopComponent
from being closed at all.
Applies to: NetBeans 6.5 and later
Further reading
You can get more details along with code examples here.