2010-12-11 66 views
1

我有一個彈出菜單的應用程序。我想以通常的方式使用彈出窗口(即當用戶右鍵單擊窗口中的任何位置時它應該出現),但我還想將它附加到窗口頂部的主菜單欄。我不知道如何做到這一點。如何添加JPopupMenu到JMenuBar?

我以爲它就像調用 myJMenuBar.add(myPopupMenu) 一樣簡單,但這不起作用。

JMenuBar.add()需要JMenu參數,而不是JPopupMenu。

有沒有人有任何建議?

回答

0

而不是嘗試重新使用JPopupMenu對象,最好的方法是封裝菜單執行的操作,並重用這些操作。彈出菜單會觸發這些操作,菜單項也一樣。

ActionJavaDoc

除了由ActionListener接口定義的actionPerformed方法,該接口允許應用程序定義,在一個地方:

  • 一個或多個文本描述函數的字符串。例如,可以使用這些字符串來顯示按鈕的懸停文本或設置菜單項中的文本。
  • 描述該功能的一個或多個圖標。這些圖標可用於菜單控件中的圖像,或用於更復雜用戶界面中的複合條目。
  • 功能的啓用/禁用狀態。而不必單獨禁用菜單項和工具欄按鈕,應用程序可以禁用實現此接口的函數。所有註冊爲狀態變化偵聽器的組件都知道禁用該項目的事件生成並相應地修改顯示。

JPopupMenuJToolBarJMenu所有提供用於創建分量和設置相應的部件上的操作便利性的方法。請參閱每個類以獲取更多信息。

0

我有同樣的問題。右鍵單擊以及頂層菜單與完全相同(複雜)的一組菜單項。如果您正在討論啓用選項,則需要考慮'Action'類,但它不涉及可見性,在我的情況下,還有一個基於當前選擇的動態列表,我想要重用。

所以我最終實現了「橋」的設計模式(我認爲)的方法,我實際使用(add()和addSeparator()):

public static class MenuBridge 
    { 
    private JPopupMenu popupMenu; 
    private JMenu menu; 

    public MenuBridge(JPopupMenu popupMenu) 
    { 
     this.popupMenu = popupMenu; 
    } 

    public MenuBridge(JMenu menu) 
    { 
     this.menu = menu; 
    } 

    public void addSeparator() 
    { 
     if(popupMenu!=null) popupMenu.addSeparator(); 
     else menu.addSeparator(); 
    } 

    public void add(JMenuItem item) 
    { 
     if(popupMenu!=null) popupMenu.add(item); 
     else menu.add(item); 
    } 
    } 

於是我可以寫一個可重複使用的方法計算菜單項並同步我的鼠標右鍵單擊與頂級菜單:

public void addTaskMenuItems(DefaultMenu menu, List<MDProcTask> taskList) 
{ 
    ... 
    menu.add()/menu.addSeparator() 
    ... 
} 

addTaskMenuItems(new DefaultMenu(popupMenu),taskList); 
... 
taskMenu.addMenuListener(new MenuListener() { 
     public void menuCanceled(MenuEvent menuevent) 
     { 
     } 
     public void menuDeselected(MenuEvent menuevent) 
     { 
     } 
     public void menuSelected(MenuEvent menuevent) 
     { 
     taskMenu.removeAll(); 
     addTaskMenuItems(new DefaultMenu(taskMenu),getSelectedTasks()); 
     taskMenu.revalidate(); 
     }});