| //  | 
 | //     Licensed to the Apache Software Foundation (ASF) under one | 
 | //     or more contributor license agreements.  See the NOTICE file | 
 | //     distributed with this work for additional information | 
 | //     regarding copyright ownership.  The ASF licenses this file | 
 | //     to you under the Apache License, Version 2.0 (the | 
 | //     "License"); you may not use this file except in compliance | 
 | //     with the License.  You may obtain a copy of the License at | 
 | //  | 
 | //       http://www.apache.org/licenses/LICENSE-2.0 | 
 | //  | 
 | //     Unless required by applicable law or agreed to in writing, | 
 | //     software distributed under the License is distributed on an | 
 | //     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 | //     KIND, either express or implied.  See the License for the | 
 | //     specific language governing permissions and limitations | 
 | //     under the License. | 
 | // | 
 |  | 
 | = DevFaqAppLifecycleHooks | 
 | :jbake-type: wiki | 
 | :jbake-tags: wiki, devfaq, needsreview | 
 | :jbake-status: published | 
 | :keywords: Apache NetBeans wiki DevFaqAppLifecycleHooks | 
 | :description: Apache NetBeans wiki DevFaqAppLifecycleHooks | 
 | :toc: left | 
 | :toc-title: | 
 | :syntax: true | 
 |  | 
 | == 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 | 
 | (link:DevFaqPlatformAppAuthStrategies.asciidoc[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 link:http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/ModuleInstall.html[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: | 
 |  | 
 | [source,java] | 
 | ---- | 
 |  | 
 | @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 link:http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html[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 link:http://wiki.netbeans.org/BookNBPlatformCookbookCH01#Module_Installer[here]. | 
 |  | 
 | == Apache Migration Information | 
 |  | 
 | The content in this page was kindly donated by Oracle Corp. to the | 
 | Apache Software Foundation. | 
 |  | 
 | This page was exported from link:http://wiki.netbeans.org/DevFaqAppLifecycleHooks[http://wiki.netbeans.org/DevFaqAppLifecycleHooks] ,  | 
 | that was last modified by NetBeans user Javydreamercsw  | 
 | on 2012-07-31T13:15:59Z. | 
 |  | 
 |  | 
 | *NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed. |