java - NetBeans 声明式操作注册与节点弹出菜单

标签 java annotations action netbeans-platform

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

当我想将这样的操作添加到节点的上下文菜单时,问题就出现了。在那里公开操作意味着您必须从 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 和丑陋的操作名称字符串常量。我觉得它很脆弱。

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

最佳答案

在 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(),请包含完整的实例路径并仅返回列表的第一个元素。

关于java - NetBeans 声明式操作注册与节点弹出菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6306974/

相关文章:

java - 构建我的 Java 应用程序

java - 检测多个物体之间碰撞的正确方法是什么?

java - 没有注释的 JAXB Unmarshal

redirect - Struts 2如何显示保存在拦截器中的消息,该消息将重定向到另一个操作?

php - 在任何操作或页面加载之前执行的 WordPress Hook

java - 如何在处理中使用 boolean 数组制作按钮?

Java 正则表达式和 json

swift - Mapbox - calloutAccessoryControllerTapped

java - 如何在 Java 或 Kotlin 中使用我自己的注释包装 @Column 注释

html - 在客户结帐时更改颜色并禁用温度的按钮