If you are writing an action, consider using one of the context sensitive action classes in the apis such as NodeAction or CookieAction.

For other types of code (or for actions sensitive to something that does not implement Node.Cookie in the active TopComponent's or Node's Lookup, consider using Utilities.actionsGlobalContext().

Utilities.actionsGlobalContext() returns a Lookup which proxies the Lookup of the active (focused) TopComponent's Lookup (which, if it is an explorer view, is proxying the Lookup(s) of whatever Node(s) are selected). You can do something like this:

Lookup.Template tpl = new Lookup.Template (SomeApiClass.class);
Lookup.Result res = Utilities.actionsGlobalContext().lookup (tpl);
res.addLookupListener (new LookupListener() {
   public void resultChanged (LookupEvent evt) {
     Collection c = ((Lookup.Result) evt.getSource()).allInstances();
     //do something with the collection of 0 or more instances - the collection has changed

The nice thing about this approach is that, unless your code specifically cares about Nodes, you don't need to depend on the Nodes API.

Source: NetBeans FAQ