Die Verwendung von Item Models soll vorab anhand eines Beispiels
verdeutlicht werden (das komplette
ItemModelSnipped
findet sich
hier).
Das Rahmenprogramm sieht wie folgt aus:
1 public final class ItemModelSnipped implements IApplication { 2 3 @Override 4 public void start(final IApplicationLifecycle lifecycle) { 5 6 //create a root frame 7 final IFrameBluePrint frameBp = BPF.frame(); 8 frameBp.setSize(new Dimension(400, 300)).setTitle("Menu and Item Models"); 9 final IFrame frame = Toolkit.createRootFrame(frameBp, lifecycle); 10 11 //Create the menu bar 12 final IMenuBarModel menuBar = frame.getMenuBarModel(); 13 14 //Use a border layout, add toolbar and composite 15 frame.setLayout(BorderLayout.builder().gap(0).build()); 16 final IToolBarModel toolBar = frame.add(BPF.toolBar(), BorderLayout.TOP).getModel(); 17 final IComposite composite = frame.add(BPF.composite().setBorder(), BorderLayout.CENTER); 18 19 //set the root frame visible 20 frame.setVisible(true); 21 } 22 }
Es wird ein Frame verwendet, welches mittels eines Border Layout eine Toolbar und ein Composite darstellt. Zudem wird eine Menu Bar erzeugt.
Der folgende Code beinhaltet die Erzeugung der Items und Menüs:
1 //create a checked item for filter 2 final CheckedItemModel filter = new CheckedItemModel("Filter", IconsSmall.FILTER); 3 filter.setSelected(true); 4 5 //create save action (with constructor) 6 final ActionItemModel save = new ActionItemModel("Save", IconsSmall.DISK); 7 save.setAccelerator(VirtualKey.S, Modifier.CTRL); 8 9 //create copy action (with constructor) 10 final ActionItemModel copy = new ActionItemModel("Copy", IconsSmall.COPY); 11 copy.setAccelerator(VirtualKey.C, Modifier.CTRL); 12 13 //create paste action (with builder) 14 final IActionItemModel paste 15 = ActionItemModel 16 .builder() 17 .setText("Paste") 18 .setIcon(IconsSmall.PASTE) 19 .setAccelerator(VirtualKey.V,Modifier.CTRL) 20 .build(); 21 22 //create a menu and add items 23 final MenuModel menu = new MenuModel("Menu"); 24 menu.addItem(save); 25 menu.addItem(copy); 26 menu.addItem(paste); 27 menu.addSeparator(); 28 menu.addItem(filter); 29 menu.addSeparator(); 30 31 //create a sub menu and add some items 32 final IMenuModel subMenu = menu.addMenu("Sub Menu"); 33 final IActionItemModel action1 = subMenu.addActionItem("Action 1"); 34 final IActionItemModel action2 = subMenu.addActionItem("Action 2"); 35 final IActionItemModel action3 = subMenu.addActionItem("Action 3"); 36 37 //add the menu to the menu bar 38 menuBar.addMenu(menu); 39 40 //sets the menu as popup menu on the composite 41 composite.setPopupMenu(menu); 42 43 //add some actions and items to the toolbar 44 toolBar.addItem(save); 45 toolBar.addItem(copy); 46 toolBar.addItem(paste); 47 toolBar.addSeparator(); 48 toolBar.addItem(filter); 49 toolBar.addSeparator(); 50 51 //add menu to the toolbar 52 toolBar.addItem(menu);
Anschließend werden zu einigen Items Listener hinzugefügt, welche deren Funktion mit Hilfe einer Konsolenausgabe belegen:
1 //add listeners to the items 2 filter.addItemListener(new SysoutSelectionListener(filter)); 3 save.addActionListener(new SysoutActionListener(save)); 4 copy.addActionListener(new SysoutActionListener(copy)); 5 paste.addActionListener(new SysoutActionListener(paste)); 6 action1.addActionListener(new SysoutActionListener(action1)); 7 action2.addActionListener(new SysoutActionListener(action2)); 8 action3.addActionListener(new SysoutActionListener(action3));
Die folgenden Abbildungen zeigen das Ergebnis, jeweils mit geöffnetem Main Menu, ToolBar Menu und Popup Menu:
Deaktiviert man in der Toolbar nun zum Beispiel den
Filter Toggle Button, wird auch das
entsprechende Checked Menu Item in den drei vorhandenen Menüs
deaktiviert und auf dem filter
Item ein
Selection Event gefeuert.
Im folgenden wird nun Action2 ausgeblendet:
action2.setVisible(false);
Die Abbildung zeigt das Ergebnis:
Action2 wird in den anderen Menüs selbstverständlich auch nicht
mehr angezeigt. Mit Hilfe von
setVisible(false)
wird der gleiche visuelle
Effekt erzielt, als hätte man:
subMenu.removeItem(action2);
ausgeführt. Allerdings müsste man hier zum wieder sichtbar machen das Folgende ausführen:
subMenu.addItem(1, action2);
was bedeutet, dass man den Index kennen muss, wo das Item eingefügt werden soll, während man im ersten Fall mit
action2.setVisible(true);
auskommt.
Anmerkung: An welchem Index man eine Action wieder sichtbar machen müsste, ist bei mehr als einem ausgeblendeten Item nicht mehr trivial, und ohne genaue Kenntnis aller Menüeinträge und deren Sichtbarkeit nicht lösbar.