2011-06-10 2 views
3

L'assistant "Nouvelle action" de NetBeans 7.0 génère une classe qui implémente l'interface ActionListener et comporte plusieurs annotations. Ces annotations placent des références à cette action dans les barres d'outils/menus spécifiés dans l'assistant. La plupart de cela est expliqué dans le NetBeans wiki et fonctionne comme prévu.Enregistrement de l'action déclarative NetBeans par rapport au menu contextuel du nœud

Le problème se pose lorsque je souhaite ajouter une telle action au menu contextuel d'un nœud. Exposer des actions signifie que vous devez renvoyer des instances concrètes de vos actions à partir de la méthode Node.getActions(..). La pièce manquante ici est que j'ai un ActionListener avec quelques annotations fantaisistes, mais à la place j'ai besoin d'une instance Action qui est soutenue par cet écouteur. Lorsque vous essayez de combler cette lacune je suis tombé sur un blog post by Geertjan, qui semble en quelque sorte lié et conduit à une méthode statique j'ai ajouté à mon ActionListener:

public static Action findAction() throws Exception { 
    final FileObject fo = FileUtil.getConfigFile(
      "Actions/Tools/foo-bar-Action.instance"); 

    final DataObject dob = DataObject.find(fo); 
    final InstanceCookie ic = dob.getLookup().lookup(InstanceCookie.class); 

    if (ic != null) { 
     final Object instance = ic.instanceCreate(); 
     if (instance instanceof Action) { 
      return (Action) instance; 
     } 
    } 

    return null; 
} 

Bien que cela fonctionne, il est sûrement pas le plus beau morceau de code avec tout ce qui passe par l'API du système de fichiers et cette chaîne de nom d'action laide constante. Cela me semble très fragile.

Donc, je voudrais savoir quel est le moyen préféré pour obtenir mon action générée par l'assistant dans le menu contextuel d'un nœud? Si cela est important, je voudrais mentionner que mon action est sensible au contexte (il faut donc qu'une interface spécifique dans la recherche soit activée).

Répondre

2

Il existe une méthode d'utilitaire dans org.openide.util.Utilities appelée actionsForPath (chemin d'accès aux chaînes). Avec cela, je remplacerais le code ci-dessus avec quelque chose comme ce qui suit dans le nœud:

import org.openide.util.Utilities; 
... 
public static final String FOO_CLASS_PATH = "Actions/Tools"; 
... 
@Override 
public Action[] getActions(boolean context) { 
    List<? extends Action> actions = Utilities.actionsForPath(FOO_CLASS_PATH); 
    return actions.toArray(new Action[actions.size()]); 
} 

Ceci renverra toutes les actions inscrites (dans ce cas) Outils. J'aime placer des actions spécifiques aux nœuds dans une catégorie pour le nœud spécifique en utilisant les annotations @ActionID ou @ActionReferences sur la classe Action.

Pour spécifier uniquement une instance d'action spécifique, comme pour getPreferredAction(), incluez le chemin d'instance complet et renvoyez uniquement le premier élément de la liste.

Questions connexes