3

NetBeans 7.0 中的“新建操作”向导会生成一个类,该类实现该ActionListener接口并具有多个注释。这些注释将对该操作的引用放置在向导中指定的工具栏/菜单中。其中大部分内容在 NetBeans wiki中进行了解释并按预期工作。

当我想将这样的操作添加到节点的上下文菜单时,就会出现问题。在那里公开动作意味着您必须从Node.getActions(..)方法返回动作的具体实例。这里缺少的部分是我有一个ActionListener带有一些花哨的注释,但是我需要一个Action由该侦听器支持的实例。当试图填补这个空白时,我偶然发现了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 和丑陋的动作名称字符串常量。我觉得它很脆弱。

所以我想知道将向导生成的操作放入节点的上下文菜单的首选方法是什么?如果这很重要,我想提一下我的操作是上下文感知的(因此它需要启用查找中的特定接口)。

4

1 回答 1

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 注释将特定于节点的动作放在特定节点的类别中。

要仅指定一个特定的 Action 实例,例如 getPreferredAction(),请包含完整的实例路径并仅返回 List 的第一个元素。

于 2011-12-04T16:48:18.657 回答