3

NetbeansRCPを使用してデスクトップアプリに取り組んでいます。TopComponentsの注釈を介してメニューに追加されているメニュー項目がいくつかあります。ログに記録されたユーザーのアクセス権に応じて、これらのメニュー項目のいくつかを無効にできるようにしたいと思います。

4

2 に答える 2

4

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つです。

于 2012-11-07T20:35:05.870 に答える
2
于 2012-11-06T07:38:58.587 に答える