当前位置: 首页 > 知识库问答 >
问题:

如何在NetBeans插件中创建动态菜单?

呼延运恒
2023-03-14

我正在开发一个NetBeans插件,它需要使用“动态”菜单,因为目前必须在专用于某个菜单项及其操作的类中硬编码。然而,我希望允许用户通过插件提供的UI更改菜单项的值(它们的作用-这将在主方法中处理变量,我不允许用户为主方法本身编写代码-它们被调用的内容及其关联的键盘快捷键),以及添加和删除菜单项。我的插件可能会从一个文件中读取这些首选项,理想情况下,只有一个类可以创建所有这些动态菜单项,其值在首选项文件中定义。

我知道有一种方法可以做到这一点,但我能在上面找到的唯一真正的信息是这个帖子,它链接到的bugzilla页面目前似乎已关闭,所以这对我没有什么帮助。。。那么,如何准确地用动态菜单项创建动态菜单呢?

我有NetBeans版本8.1和JDK8。此外,当我说“动态菜单项”或类似的内容时,我指的是从菜单中提供给您的实际选项,这些选项可以做这些事情(无论插件要做什么,在我的情况下,当单击其中一个选项时,它会将某些数据复制到剪贴板)。

共有1个答案

孔厉刚
2023-03-14

我在netbeans RCP应用程序中使用动态菜单。下面是我用于将动态菜单项添加到右键单击菜单、工具栏、菜单栏中的常规格式。。。

import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionRegistration;
import org.openide.awt.Actions;
import org.openide.awt.DynamicMenuContent;
import org.openide.util.actions.Presenter;

/* Register your dynamic action using annotations (perferred over layer.xml entries)
@ActionID(id = "ExampleDynamicMenu", category = "Edit")
@ActionRegistration(lazy = false, displayName = "ExampleDynamicMenu")
@ActionReferences({
    @ActionReference(path = "Loaders/folder/any/Actions", position = 666),
    @ActionReference(path = "Loaders/content/unknown/Actions", position = 666),
    @ActionReference(path = "Loaders/text/xml/Actions", position = 666),
    @ActionReference(path = "Projects/Actions", position = 666),
    @ActionReference(path = "Editors/TabActions", position = 666)
})
*/
public class ExampleDynamicMenu extends AbstractAction implements DynamicMenuContent, Presenter.Popup {

    @Override
    public JMenuItem getPopupPresenter() {
        JMenu menu = new JMenu(this);
        JComponent[] menuItems = createMenu();
        for (JComponent item : menuItems) {
            menu.add(item);
        }
        return menu;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // does nothing, this is a popup menu
    }

    @Override
    public JComponent[] getMenuPresenters() {
        return createMenu();
    }

    @Override
    public JComponent[] synchMenuPresenters(JComponent[] items) {
        return createMenu();
    }

    private JComponent[] createMenu() {
        List<JComponent> items = new ArrayList<>(20);

        //TODO: Load the list of actions stored in the preferences, and for each action add a menu-item to the dynamic menu.
        // Note: You preferences can simply store the Action's category and id; then you can always get the action instances using
        //    Action action = Actions.forID(category_string, id_string);
        List<Action> actionsList = YOUR_PREFERENCES_GETTER.getActions(); //You have to figure out how to store and retrieve user's preferred actions list yourself :)
        for (Action action : actionsList) {
            if (action == null) { //Assume null means add a separator
                if (items.size() > 0 && !(items.get(items.size() - 1) instanceof JSeparator)) { //Only add separators after actions.
                    items.add(new JPopupMenu.Separator());
                }
            } else { //Convert action to menu item, and build your dynamic menu
                items.add(toMenuItem(action));
            }
        }
        return items.toArray(new JComponent[items.size()]);
    }

    /**
     * Creates a menu item from an action.
     *
     * @param action an action
     * @return JMenuItem
     */
    private static JMenuItem toMenuItem(Action action) {
        JMenuItem item;
        if (action instanceof Presenter.Menu) {
            item = ((Presenter.Menu) action).getMenuPresenter();
        } else if (action instanceof Presenter.Popup) {
            item = ((Presenter.Popup) action).getPopupPresenter();
        } else {
            item = new JMenuItem();
            Actions.connect(item, action, false);
        }
        return item;
    }
}
 类似资料:
  • Netbeans阻止我创建静态类。我怎么做一个? 我将类创建为:右键单击project>new>Java类。然后我只是在创建的类上添加一个static关键字。

  • 问题内容: 我希望在游戏中(SpriteKit)中创建带有按钮和图像的商店,但我需要使这些物品能够滚动,以便玩家可以上下滚动商店(就像UITableView一样,但每个商店中都有多个SKSpriteNodes和SKLabelNodes细胞)。知道如何在SpriteKit中做到这一点吗? 问题答案: 正如所答应的第二个答案,我只是想出了问题。 我建议始终从gitHub项目中获取此代码的最新版本,以防

  • 伙伴。我有一个菜单组件在我的next.jsWeb应用程序。菜单的数据是通过GraphQL动态生成的。我想要菜单组件的服务器端渲染。我尝试使用getStatic Props()在服务器上呈现数据。但是getStatic Props()不能在组件上工作,它只能在页面上工作。 现在,我该如何解决这个问题呢?我不想在每一页的菜单上重复相同的代码,我想重复使用代码或类似的东西。请帮我解决这个问题。提前感谢。

  • 问题内容: 我想使用JUnit 4创建一个junit测试套件,在运行测试套件之前,要包含的测试类的名称是未知的。 在JUnit 3中,我可以这样做: 并让该方法确定要运行的测试类。 在JUnit 4中,文档说要使用批注:构建我的测试套件。有许多SO答案显示了如何执行此操作。不幸的是,我看到的示例似乎不允许传递动态生成的TestClasses列表。 这样的建议我必须继承我不想做的子类。 动态指定的测

  • 我正在用android创建一款纸牌游戏(21点)。前两张卡是easy card1和card2,但是我想按一下“点击我”按钮,发一张新卡,并将其分配给card3、card4等。有没有任何方法可以做到这一点,而无需创建所需的最大变量数,并使用if-then语句检查它们是否被分配了值?

  • 我正在将java脚本移动到dart,在java脚本中我创建了动态变量,例如 我怎么能用飞镖呢?