Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NetBeans声明性操作注册与节点弹出菜单_Java_Annotations_Action_Netbeans Platform - Fatal编程技术网

Java NetBeans声明性操作注册与节点弹出菜单

Java NetBeans声明性操作注册与节点弹出菜单,java,annotations,action,netbeans-platform,Java,Annotations,Action,Netbeans Platform,NetBeans 7.0中的“新建操作”向导生成一个类,该类实现了ActionListener接口,并具有多个注释。这些注释将对该操作的引用放置在向导中指定的工具栏/菜单中。其中大部分在NetBeans中进行了解释,并按预期工作 当我想将这样的操作添加到节点的上下文菜单时,问题就出现了。在那里公开操作意味着您必须从方法返回操作的具体实例。这里缺少的一点是,我有一个ActionListener,带有一些奇特的注释,但是我需要一个由这个监听器支持的Action实例。当我试图填补这一空白时,我偶然发现

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

当我想将这样的操作添加到节点的上下文菜单时,问题就出现了。在那里公开操作意味着您必须从方法返回操作的具体实例。这里缺少的一点是,我有一个
ActionListener
,带有一些奇特的注释,但是我需要一个由这个监听器支持的
Action
实例。当我试图填补这一空白时,我偶然发现了一个博客,它似乎与我的
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和丑陋的动作名称字符串常量编写的最漂亮的代码。我觉得它很脆


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

org.openide.util.Utilities中存在一个名为actionsForPath(字符串路径)的实用程序方法。使用此方法,我将在节点中使用类似以下内容的代码替换上述代码:

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()] );
}
import org.openide.util.Utilities;
...
公共静态最终字符串FOO_CLASS_PATH=“Actions/Tools”;
...
@凌驾
公共操作[]getActions(布尔上下文){
列表