2011-11-09 23 views
1

私は、メニュー項目(アクション)を保持するmenumanager "menuManager"と、より多くのアクションを含むmenumanager "subMenu"というサブメニューを持っています。Jface menumanagerを無効にする(グレーアウト)

final MenuManager subMenu = new MenuManager("Main",null); 
subMenu.add(mActionClose);  

MenuManager menuManager = new MenuManager("#PopupMenu", "contextMenu"); 
menuManager.add(action1); 
menuManager.add(action2); 
menuManager.add(subMenu); 

アクションではsetEnabled(false)を設定できますが、menumanagerでは設定できません。

答えて

1

isEnabled()の方法をMenuManagerに変更しても効果はありません。あなたができることは、関連するMenuItemへのアクセスを取得し、それを無効にしようとしています。

まず、あなたが関連付けられているMenuにアクセスするには、「コンテキストメニュー」マネージャーにIMenuListenerを追加します。リスナーで

public void menuAboutToShow(IMenuManager manager) { 
    manager.getMenu().addListener(SWT.Show, showContextMenuListener); 
} 

を、あなたのサブメニューマネージャに一致するMenuItemを見つける:

public void handleEvent(Event event) { 
    for (MenuItem item: ((Menu)event.widget).getItems()) 
     //MenuItem data should be our MenuManager 
     if (item.getData().equals(subMenu)) { 
      //Disable the sub-menu item 
      item.setEnabled(false); 
      //Add listener to sub-menu (see comments below the code block) 
      item.getMenu().addListener(SWT.Show, showSubMenuListener); 
     } 
} 

この問題は、MenuManagerクラスにバグ修正コードがあり、サブメニューアイテムがクリックされると(アイテムが含まれている場合)再び有効になることが問題です。 ==

public void handleEvent(Event event) { 
    ((Menu)event.widget).getParentItem().setEnabled(false); 
} 
+0

これはテストしましたか? –

+0

と私はそこで何をすべきですか? – kenny

+1

@TonnyMadsenあなたは正しいです、isEnabled()はむしろ無駄なメソッドです... –

1

有効に設定するための方法はありません。これを上書きするには、メニューをクリックした後、表示されたときにサブメニュー項目の有効化を更新するサブメニューにSWT.Showリスナーを追加する必要があります私はコードを見て、そのレンダリング中にisEnabled()を使って見ていませんでした。ほとんどの場合、メニューが空の場合はサブメニューを表示しません。

SWT.Showイベントでポップアップメニューが表示されない場合はサブメニューが無効になりますが、子どもがいないと判断できますが、その動作は少し直感的です。

まともUXの動作では、常にそこにそのサブメニューを持つことであるが、それは、それが使用されるべきとき1つの無効なメニュー項目に拡大していない持っている:「>利用可能<何のアクションを」かまたはそのような何か「< >を有効になっていません」。

+0

私はアイテムだけを無効にすることはユーザーフレンドリーだとは思わない...私はトリックをすることができます:サブメニューを削除し、いくつかのダミーの通常のアイテム(同じキャプションを使用)に置き換えて無効にします。それはずっと。 – kenny

関連する問題