2011-06-10 59 views
3

NetBeans 7.0中的「New Action」嚮導生成一個類,該類實現了ActionListener接口並具有多個註釋。這些註釋將向此操作的引用放置在嚮導中指定的工具欄/菜單中。大部分內容在NetBeans wiki中進行了解釋,並按預期工作。NetBeans聲明式操作註冊與節點彈出式菜單

當我想要將這樣的動作添加到節點的上下文菜單時,就會出現問題。在此暴露操作意味着您必須從Node.getActions(..)方法返回您的操作的具體實例。這裏缺失的是我有一個ActionListener與一些奇特的註釋,但相反,我需要一個Action實例,這是由此偵聽器支持。當試圖填補這一空白,我偶然發現了一個博客post by Geertjan,這看起來有點相關,並導致了一個靜態方法,我添加到我的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; 
} 

雖然這個工作,它肯定不是最美麗的一塊代碼與所有通過文件系統API和醜陋的行爲名稱字符串常量。這對我來說似乎非常脆弱。

所以我想知道什麼是讓我的嚮導生成的動作進入節點的上下文菜單的首選方式是什麼?如果這很重要,我想提一下,我的操作是上下文感知的(所以它需要啓用查找中的特定接口)。

回答

2

在org.openide.util.Utilities中存在一個名爲actionsForPath(String path)的實用程序方法。利用這一點,我會像在節點以下替換上面代碼:

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()]); 
} 

這將返回所有註冊過的動作(在這種情況下)工具。我喜歡在Action類中使用@ActionID或@ActionReferences註釋將節點特定的Actions放置在特定節點的類別中。

要僅指定一個特定的Action實例(例如getPreferredAction()),請包含完整的實例路徑並僅返回List的第一個元素。