NetbeansRCPを使用してデスクトップアプリに取り組んでいます。TopComponentsの注釈を介してメニューに追加されているメニュー項目がいくつかあります。ログに記録されたユーザーのアクセス権に応じて、これらのメニュー項目のいくつかを無効にできるようにしたいと思います。
2 に答える
NetBeansプラットフォームでこれを行う1つの方法は、メニューに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
メニューにを登録するgetMenuPresenter()
と、プラットフォームによってメソッドが呼び出され、メニューに追加された実際のメソッドが取得JMenuItem
されます。
通常はJMenuItem
ここを作成するだけですが、アプリケーションの他の部分でそれを取得できる必要があるため、同じインスタンスを取得できるように、メニュー項目のある種のレジストリを保持する必要があります。 。
これを行う1つの方法は、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
、すべてを実行できます。ControllableMenuItem
Collection<? extends ControllableMenuItem> menuItems =
Lookup.getDefault().lookupAll(ControllableMenuItem.class);
for (ControllableMenuItem item : menuItems) {
item.setEnabled(isAuthorized());
}
ただし、これが正しく機能するためのもう1つの要素があります。Presenter.Menu
が取得しているのと同じインスタンスを取得していることを保証する方法が必要ですLookup
。これを行う1つの方法(確かにあまりエレガントではありません)は、を自分自身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
。
これは、これを行う1つの方法にすぎません。ここでのポイントは、ACLを無効にする必要があるときに、ACLされたすべてのメニュー項目の同じインスタンスを取得するためのメカニズムを用意する必要があるということです。
どのメニュー項目が実際にメニューシステムに組み込まれるかを制御する別のアプローチは、アクセスレベルごとに個別のモジュールを作成し、ユーザーが特定の機能グループに対して許可されていない場合はモジュールを無効にすることです。これは多くの点で有益であり、モジュラーシステムを使用することの強みの1つです。
Oracleチュートリアル「メニューの使用方法」、「コード例の実行」を参照してください。
、、および
Xxx.setEnabled(false)
_JMenu
_JMenuItem
_JRadioButtonMenuItem
JCheckBoxMenuItem