【问题标题】:How to create a mouse rightclick menu for a jface treeviewer如何为 jface treeviewer 创建鼠标右键菜单
【发布时间】:2018-12-19 10:45:41
【问题描述】:

我已经使用 JFace 创建了一个TreeViewer,但现在我必须向节点添加一个右键单击侦听器。右键单击完成后,它必须显示如下菜单:

  1. 做点什么
  2. 什么都不做
  3. 删除

我正在尝试按如下方式执行此操作,但它会引发空指针异常。

MenuManager menuMgr = new MenuManager();
        menuMgr.setRemoveAllWhenShown(true);

        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager menuManager) {

                IContributionManager menu = null;
                MenuItem[] items = (MenuItem[]) menu.getItems();
                for (int i = 0; i < items.length; i++)
                    items[i].dispose();

                MenuItem itemCollectionFolder = new MenuItem((Menu) menu, SWT.NONE);
                itemCollectionFolder.setText("Add Something" );

                MenuItem itemNewTestCase = new MenuItem((Menu) menu, SWT.NONE);
                itemNewTestCase.setText("Do Nothing" );

            }
        });

        Control tree = treeViewer.getControl();

        Menu menu = menuMgr.createContextMenu(tree);

        tree.setMenu(menu);

【问题讨论】:

    标签: java jface e4 treeviewer


    【解决方案1】:

    试试这个,别忘了打电话: createContextMenu(查看器);

    /**
     * Creates the context menu
     *
     * @param viewer
     */
    protected void createContextMenu(Viewer viewer) {
        MenuManager contextMenu = new MenuManager("#ViewerMenu"); //$NON-NLS-1$
        contextMenu.setRemoveAllWhenShown(true);
        contextMenu.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager mgr) {
                fillContextMenu(mgr);
            }
        });
    
        Menu menu = contextMenu.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
    }
    
    /**
     * Fill dynamic context menu
     *
     * @param contextMenu
     */
    protected void fillContextMenu(IMenuManager contextMenu) {
        contextMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
    
        contextMenu.add(new Action("Do Something") {
            @Override
            public void run() {
                // implement this
            }
        });
        contextMenu.add(new Action("Do Nothing") {
            @Override
            public void run() {
                // don't do anything here
            }
        });
        contextMenu.add(new Action("Delete") {
            @Override
            public void run() {
                // implement this
            }
        });
    }
    

    要获取 treeviewer 的选定元素,请执行以下操作:

    IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
    selection.getFirstElement();
    selection.toList(); // or if you handle multi selection
    

    【讨论】:

    • 当我将 org.eclipse.ui 导入到 IWorkbenchActionConstants 的导入包并运行代码时,它会抛出错误,因为没有找到应用程序 ID,所以这是适合我使用 e4 应用程序的包@flavio.donze
    • 您实际上可以删除此行,它用于通过扩展点使用操作/命令扩展您的菜单。我认为您不需要此功能。
    • 你能告诉我如何为这个上下文菜单和那个子上下文菜单添加子上下文菜单,用户应该能够为其输入一些值。那么如何做到这一点@flavio.donze
    • 最好创建一个新问题
    • 当我按下子菜单中的任何按钮时,我如何获得被按下的子菜单的名称
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    相关资源
    最近更新 更多