我正在使用Netbeans RCP开发桌面应用程序。通过TopComponents中的注释,我添加了许多菜单项。我希望能够根据已登录用户的访问权限来禁用其中几个菜单项。
我正在使用Netbeans RCP开发桌面应用程序。通过TopComponents中的注释,我添加了许多菜单项。我希望能够根据已登录用户的访问权限来禁用其中几个菜单项。
@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
时,平台将调用getMenuPresenter()
方法以获取实际添加到菜单中的JMenuItem
。JMenuItem
,但由于您需要能够在应用程序的其他部分中获得它,因此您需要保留某种菜单项注册表,以便在检索相同实例时使用。ServiceProvider
。通过这种方式,您可以在需要启用/禁用它们时Lookup
所有这些菜单项。
ServiceProvider
接口:public interface ControllableMenuItem {
void setEnabled(boolean enabled);
JMenuItem getMenuItem();
}
一个作为ServiceProvider
注册的ControllableMenuItem
实现:
@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;
}
}
现在,当您需要启用/禁用菜单项时,您可以查找所有的可控制菜单项:
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();
}
}
ControllableMenuItem
时,可以确保获得相同的实例。查看Oracle教程如何使用菜单,运行代码示例。
对于JMenu
、JMenuItem
、JRadioButtonMenuItem
和JCheckBoxMenuItem
,使用Xxx.setEnabled(false)
。
Action
和 AbstractAction
类。 - Andrew Thompson