3

我正在使用 Netbeans RCP 开发桌面应用程序。我有许多菜单项通过 TopComponents 中的注释添加到菜单中。我希望能够禁用其中几个菜单项,具体取决于登录用户的访问权限。

4

2 回答 2

4

在 NetBeans 平台中执行此操作的一种方法是在菜单中注册Presenter.Menu :

@ActionID(id = "com.company.MyPresenter", category = "Edit")
@ActionRegistration(displayName = "com.company.Bundle#CTL_MyPresenter")
@ActionReference(path = "Menu/Edit", position = 1)
public class MyPresenter implements Presenter.Menu {

    @Override
    public JMenuItem getMenuPresenter() {
        // return menu item from your ACL'd registry
    }
}

当您Presenter.Menu在菜单中注册 a 时getMenuPresenter(),平台会调用该方法以获取JMenuItem添加到菜单中的实际内容。

通常你只JMenuItem需要在这里构建一个,但由于你需要能够在应用程序的其他部分中获取它,你需要保留某种菜单项的注册表,以便检索相同的实例.

一种方法是将所有 ACL 的菜单项注册为ServiceProvider. 通过这种方式,您可以Lookup在需要启用/禁用它们时全部使用它们。

一个ServiceProvider接口:

public interface ControllableMenuItem {

    void setEnabled(boolean enabled);

    JMenuItem getMenuItem();
}

ControllableMenuItem注册为的实现ServiceProvider

@ServiceProvider(service = ControllableMenuItem.class)
public class MyMenuItem implements ControllableMenuItem {

    private JMenuItem menuItem;

    @Override
    public void setEnabled(boolean enabled) {
        getMenuItem().setEnabled(enabled);
    }

    @Override
    public JMenuItem getMenuItem() {
        if (menuItem == null) {
            menuItem = new JMenuItem(new MyAction());
        }
        return menuItem;
    }
}

现在,您可以在需要启用/禁用Lookup所有ControllableMenuItems 时:

Collection<? extends ControllableMenuItem> menuItems = 
    Lookup.getDefault().lookupAll(ControllableMenuItem.class);
for (ControllableMenuItem item : menuItems) {
    item.setEnabled(isAuthorized());
}

然而,还有一件事情可以正常工作。您需要一种方法来保证Presenter.Menu得到的实例与得到的实例相同Lookup。做到这一点的一种方法 - 诚然不是很优雅 - 是将其注册MenuItem@ServiceProvider自己并在以下位置查找getMenuPresenter()

// replaces the above annotation of MyMenuItem
@ServiceProviders(value = {
    @ServiceProvider(service = ControllableMenuItem.class),
    @ServiceProvider(service = MyMenuItem.class)
})
public class MyMenuItem implements ControllableMenuItem {...}

public class MyPresenter implements Presenter.Menu {

    @Override
    public JMenuItem getMenuPresenter() {
        MyMenuItem myMenuItem = Lookup.getDefault().lookup(MyMenuItem.class);
        return myMenuItem.getMenuItem();
    }
}

通过这种方式,您可以保证无论何时您都获得相同的Lookup实例ControllableMenuItem

这只是这样做的一种方式。这里的要点是,当您需要禁用它们时,您需要有一种机制来获取所有 ACL 菜单项的相同实例。

控制哪些菜单项实际进入菜单系统的另一种方法是为每个访问级别创建单独的模块,并在用户未被授权使用特定功能组时简单地禁用模块。这在许多方面都是有益的,并且是使用模块化系统的优势之一。

于 2012-11-07T20:35:05.870 回答
2
于 2012-11-06T07:38:58.587 回答