2010-12-11 16 views
1

Ich habe eine Anwendung mit einem Popup-Menü. Ich möchte das Popup auf die übliche Weise verwenden (d. H. Es sollte erscheinen, wenn der Benutzer mit der rechten Maustaste irgendwo im Fenster klickt), aber ich möchte es auch an die Hauptmenüleiste oben im Fenster anhängen. Ich bin mir nicht sicher, wie ich das machen soll.Wie füge ich ein JPopupMenu zu einer JMenuBar hinzu?

Ich dachte, es wäre so einfach wie das Rufen myJMenuBar.add (myPopupMenu) , aber das funktioniert nicht.

JMenuBar.add() möchte einen JMenu-Parameter, kein JPopupMenu.

Hat jemand irgendwelche Vorschläge?

Antwort

0

Anstatt zu versuchen, das Objekt JPopupMenu wiederzuverwenden, wäre es am besten, die Aktionen der Menüs zu kapseln und diese wiederzuverwenden. Das Popup würde diese Aktionen auslösen, ebenso wie die Menüpunkte.

Vom ActionJavaDoc:

Neben dem actionPerformed Verfahren durch die Action Schnittstelle definiert, diese Schnittstelle der Anwendung ermöglicht, an einem Ort zu definieren:

  • eines oder mehr Text Zeichenfolgen, die die Funktion beschreiben. Diese Zeichenfolgen können beispielsweise verwendet werden, um den Überführungstext für eine Schaltfläche anzuzeigen oder den Text in einem Menüelement festzulegen.
  • Ein oder mehrere Symbole, die die Funktion darstellen. Diese Symbole können für die Bilder in einem Menüsteuerelement oder für zusammengesetzte Einträge in einer anspruchsvolleren Benutzeroberfläche verwendet werden.
  • Der aktivierte/deaktivierte Status der Funktionalität. Anstatt die Menüoption und die Symbolleistenschaltfläche separat deaktivieren zu müssen, kann die Anwendung die Funktion deaktivieren, die diese Schnittstelle implementiert. Alle Komponenten, die als Listener für die Statusänderung registriert sind, können dann die Ereignisgenerierung für diesen Artikel deaktivieren und die Anzeige entsprechend ändern.

und

JPopupMenu, JToolBar und JMenu bieten alle bequeme Methoden für eine Komponente zu schaffen und die Einwirkung auf die entsprechenden Komponente einzustellen. Weitere Informationen finden Sie in jeder dieser Klassen.

0

Ich hatte das gleiche Problem. Ein Rechtsklick sowie ein Top-Menü mit genau der gleichen (komplizierten) Menge von Menüpunkten. Die 'Action'-Klasse sollte berücksichtigt werden, wenn Sie über Aktivierungsauswahl sprechen, aber es geht nicht um Sichtbarkeit, und in meinem Fall gab es auch eine dynamische Liste von Einträgen basierend auf einer aktuellen Auswahl, die ich wiederverwenden wollte.

So landete ich ein ‚Brücke‘ Entwurfsmuster Umsetzung bis (glaube ich) für die Methoden, die ich tatsächlich nutzen (add() und 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); 
    } 
    } 

So dann kann ich eine wiederverwendbare Methode schreiben das berechnet die Menüelemente und synchronisiert meinen rechten Mausklick mit dem Menü der obersten Ebene:

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(); 
     }}); 
Verwandte Themen