= Nifty GUI: Create a PopUp Menu :author: :revnumber: :revdate: 2016/03/17 20:48 :relfileprefix: ../../ :imagesdir: ../.. ifdef::env-github,env-browser[:outfilesuffix: .adoc] Even though you create and populate the popup menu in Java, you still need a “placeholder in your XML file. The popup element needs to be placed _outside_ of any screen! [source,xml] ---- ... ... ---- A brief explanation of some the attributes above: * The popup id is used within your Java code so that nifty knows which popup placeholder to create. * The Controller tells Nifty which Java class handles MenuItemActivatedEvent. * The on(Secondary/Tertiary)Click tells Nifty to close the popup if the user clicks anywhere except on the menu items (in this example; you have to define the closePopup()-method yourself, in the screen controller) * The control id is used by the Java class to define a control type (i.e. Menu) The Java code within your defined ScreenController implementation: [source,java] ---- private Element popup; ... public void createMyPopupMenu(){ popup = nifty.createPopup("niftyPopupMenu"); Menu myMenu = popup.findNiftyControl("#menu", Menu.class); myMenu.setWidth(new SizeValue("100px")); // must be set myMenu.addMenuItem("Click me!", "menuItemIcon.png", new menuItem("menuItemid", "blah blah")); // menuItem is a custom class nifty.subscribe( nifty.getCurrentScreen(), myMenu.getId(), MenuItemActivatedEvent.class, new MenuItemActivatedEventSubscriber()); } public void showMenu() { // the method to trigger the menu // If this is a menu that is going to be used many times, then // call this in your constructor rather than here createMyPopupMenu() // call the popup to screen of your choice: nifty.showPopup(nifty.getCurrentScreen(), popup.getId(), null); } private class menuItem { public String id; public String name; public menuItem(String id, String name){ this.id= id; this.name = name; } } ---- * The createMyPopupMenu() method creates the menu with set width so that you can populate it. * The showMenu() method is called by something to trigger the menu (i.e. could be a Key or some other method). * Note: if you want to be able to access the popup via your id, use createPopupWithId(id, id) instead. To handle menu item events (i.e. calling a method when you click on a menu item), you register (subscribe) a EventTopicSubscriber<MenuItemActivatedEvent> class implementation to a nifty screen and element. [source,java] ---- private class MenuItemActivatedEventSubscriber implements EventTopicSubscriber { @Override public void onEvent(final String id, final MenuItemActivatedEvent event) { menuItem item = (menuItem) event.getItem(); if ("menuItemid".equals(item.id)) { //do something !!! } } }; ----