Meniuri Spre deosebire de celelate obiecte grafice, care deriv\ din clasa Component, meniurile deriv\ din clasa MenuComponent. Aceast\ excep]ie este f\cut\ deoarece multe platforme grafice limiteaz\ capabilit\]ile unui meniu. In Java AWT meniurile sunt reprezentate ca un instan]e al clasei MenuBar. Toate meniurile sunt grupate intr-un singur obiect MenuBar, care este unic pentru o fereastr\ (Frame). Meniurile vizibile permanent nu pot fi ad\ugate decat la ferestre derivate din clasa Frame. Pentru a putea con]ine un meniu, o component\ trebuie s\ implementeze interfa]a MenuContainer. Clasa Frame implementeaz\ aceast\ interfa]\. Cel mai simplu element al unui meniu este un MenuItem, care este de fapt o op]iune care, odat\ selectat\, nu mai afi[eaz\ un submeniu. A[adar un MenuBar con]ine obiecte de tip Menu, care la randul lor pot con]ine obiecte de tip MenuItem, CheckBoxMenuItem, dar [i alte obiecet de tip Menu. 22471mnf84kpq3d Clasa MenuComponent Este o clas\ abstract\, din care sunt extinse toate celelalte clase folosite pentru lucrul cu meniuri. Metode: getFont () Gets the font used for this MenuItem. np471m2284kppq getParent() Returns the parent container. setFont(Font) Sets the font to be used for this MenuItem to the specified font. toString() Returns the String representation of this MenuComponent's values. Clasa MenuBar Permite crearea barelor de meniuri asociate unei ferestre cadru (Frame). Aceast\ clas\ adapteaz\ conceptul de bar\ de meniuri la platforma pe care lucra]i. Pentru a lega bara de meniuri la o anumit\ fereastr\ trebuie apelat\ metoda setMenuBar() din clasa Frame. Constructor MenuBar () Metode add (Menu) Adaug\ un meniu la o bar\ de meniuri countMenus() Returneaz\ num\rul de meniuri pe care le con]ine bara respectiv\ getHelpMenu() Permite accesul la meniul help al unei bare de meniuri getMenu(int) Gets the specified menu. remove(int) {terge meniul localizat la indicele specificat remove(MenuComponent) {terge un anumit meniu din bara de meniuri. setHelpMenu(Menu) Sets the help menu to the specified menu on the menu bar. Clasa Menu Permite crearea unui meniu derulant intr-o bar\ de meniuri. Constructor Menu (String) Constructs a new Menu with the specified label. Menu(String, boolean) Construie[te un meniu cu afi[are permanent\, avand eticheta specificat\. Metode add (MenuItem) Adds the specified item to this menu. add(String) Adds an item with with the specified label to this menu. addSeparator() Adds a separator line, or a hypen, to the menu at the current position. countItems() Returns the number of elements in this menu. getItem(int) Returns the item located at the specified index of this menu. isTearOff() Returneaz\ true dac\ meniul este cu afi[are permanent\. remove(int) Deletes the item from this menu at the specified index. remove(MenuComponent) Deletes the specified item from this menu. Clasa MenuItem Ofer\ op]iunile individuale ale meniurilor derulante, cum sunt “Open”, “CLose”, “Exit”, etc. Este inrudit\ cu clasa CheckboxMenuItem, care permite comut\ri on/off pentru articolele de meniu. Constructor MenuItem (String nume) Construie[te un meniu avand ca etichet\ [irul nume Metode disable() Makes this menu item unselectable by the user. enable() Makes this menu item selectable by the user. enable(boolean) Conditionally enables a component. getLabel() Gets the label for this menu item. isEnabled() Checks whether the menu item is enabled. setLabel(String) Sets the label to be the specified label. Clasa CheckboxMenuItem Are aceea[i func]ionalitate cu cea a casetelor de validare, dar se utilizeaz\ in cazul meniurilor. Extinde clasa MenuItem, ad\ugand metodele getState [i setState. Constructor CheckboxMenuItem (String) Creates the checkbox item with the specified label. Metode getState() Returneaz\ starea articolului de meini (validat / invalidat) setState(boolean) Valideaz\ / Invalideaz\ articolul de meniu. Exemplu - constuirea unui meniu import java.awt.*; import java.awt.event.*; public class TestMenu1 { public static void main(String args[]) { Frame f = new Frame("Test Meniu"); MenuBar mb = new MenuBar(); Menu fisier = new Menu("File"); fisier.add(new MenuItem("Open")); fisier.add(new MenuItem("Close")); fisier.addSeparator(); fisier.add(new MenuItem("Exit")); Menu optiuni = new Menu("Options"); optiuni.add(new MenuItem("Copy")); optiuni.add(new MenuItem("Cut")); optiuni.add(new MenuItem("Paste")); Menu editare = new Menu("Edit"); editare.add(new MenuItem("Undo")); editare.add(optiuni); Menu stil = new Menu("Style"); stil.add(new CheckboxMenuItem("Bold")); stil.add(new CheckboxMenuItem("Italic")); mb.add(fisier); mb.add(editare); mb.add(stil); f.setMenuBar(mb); f.show(); } } Utilizarea meniurilor La alegerea unei op]iuni dintr-un meniu se genereaz\ un eveniment. Acesta este de tip ActionEvent [i comanda este reprezentat\ de numele op]iunii alese. A[adar pentru a activa op]iunile unui meniu trebuie implementat un obiect receptor care s\ implementeze interfa]a ActionListener [i care in metoda actionPerformed s\ specifice codul ce trebuie executat la alegerea unei op]iuni. Fiec\rui meniu in putem asocia un obiect receptor diferit, ceea ce u[ureaz\ munca in cazul in care ierarhia de meniuri este complex\. Pentru a realiza leg\tura intre obiectul meniu [i obiectul receptor trebuie s\ ad\ug\m receptorul in lista de ascult\tori a meniului respectiv prin commanda: nume_meniu.addActionListener(nume_receptor) A[adar tratarea op]iunilor dintr-un meniu este asem\n\toare cu tratarea butoanelor, ceea ce face posibil ca unui buton de pe suprafa]a de afi[are s\ ii corespund\ o op]iune intr-un meniu, ambele cu acela[i nume, tratarea evenimentului corespunz\tor ap\s\rii butonului, sau alegerii op]iunii f\candu-se o singur\ dat\. Exemplu - utilizarea meniurilor import java.awt.*; import java.awt.event.*; public class TestMenu2 { public static void main(String args[]) { MenuBar mb = new MenuBar(); /* ....... Construirea meniului ca in exemplul anterior .......... /* Fereastra f = new Fereastra("Test Meniu"); Button btnExit = new Button("Exit"); f.setMenuBar(mb); f.add(btnExit); f.pack(); f.show(); fisier.addActionListener(f); optiuni.addActionListener(f); editare.addActionListener(f); stil.addActionListener(f); btnExit.addActionListener(f); } } class Fereastra extends Frame implements WindowListener, ActionListener { public Fereastra(String titlu) { super(titlu); this.addWindowListener(this); } //metodele interfetei WindowListener public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) {System.exit(0);} public void windowClosed(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} //metoda interfetei ActionListener public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command.equals("Exit")) System.exit(0); //valabila si pt. meniu si pt. buton } } Un caz special il constituie op]iunile de tip CheckboxMenuItem. Obiectele de acest tip se g\sesc intr-o categorie comun\ cu List, Choice, CheckBox, implementeaz\ o interfa]\ comun\ ItemSelectable [i toate genereaz\ evenimente de tip ItemEvent. Din aceast\ cauz\ ac]ionarea unei op]iuni de tip CheckboxMenuItem nu va determina generarea unui eveniment de tip ActionEvent de c\tre meniul din care face parte, ci va genera un eveniment ItemEvent chiar de c\tre op]iune. Pentru a intercepta un asemenea eveniment avem nevoie de un obiect receptor care s\ implementeze interfa]a ItemListener [i s\ specifice in metoda acesteia itemStateChanged codul ce trebuie executat la validarea/invalidarea op]iunii din meniu. De asemenea receptorul trebuie inregistrat cu addItemListener. Exemplu : Menu stil = new Menu("Style"); CheckboxMenuItem stil_bold = new CheckboxMenuItem("Bold")); stil.add(stil_bold); stil_bold.addItemListener(f); //...... class Fereastra extends Frame implements WindowListener, ActionListener, ItemListener { //...... //metoda interfetei ItemListener public void itemStateChanged(ItemEvent e) { String option = (String) e.getItem(); boolean newState = (e.getStateChange()==ItemEvent.SELECTED); if (option.equals("Bold") ) System.out.println(newState); } Tipul de opera]ie selectare / deselectare este codificat de campurile statice ItemEvent.SELECTED [i ItemEvent.DESELECTED Meniuri de context (popup) Au fost introduse incepand cu AWT 1.1 [i sunt implementate prin intermediul clasei PopupMenu. Crearea: pm = new PopupMenu(“Popup”); Ad\ugarea de noi op]iuni : pm.add(new MenuItem(“Cut”)); pm.add(new MenuItem(“Copy”)); pm.addSeparator(); Afi[area se face prin : pm.show(Component c, int x, int y) [i este de obicei rezultatul ap\s\rii unui buton al mouse-ului, pentru a avea acces rapid la meniu. Meniurile de context nu se adaug\ la un alt meniu (bar\ sau sub-meniu) ci se ata[eaz\ la o component\ prin metoda add() fereastra.add(pm); Utilizarea este ins\ similar\ meniurilor orizontale Acceleratori Incepand cu Java AWT 1.1 este posibil\ specificarea unor combina]ii de taste (acceleratori - shortcuts) pentru accesarea direct\, prin intermediul tastaturii, a op]iunilor dintr-un meniu. Astfel, oric\rui obiect de tip MenuItem ii poate fi asociat un obiect de tip accelerator, definit prin intermediul clasei MenuShortcut. Singurele combina]ii de taste care pot juca rolul acceleratoriloe sunt : <Ctrl> + <Tasta> sau <Ctrl> + <Shift> + <Tasta> Clasa MenuShortcut Constructori public MenuShortcut( int Tasta ) Construieste un accelerator de tipul <Ctrl>+<Tasta> public MenuShortcut( int Tasta, boolean foloseste_shift ) Parametrul foloseste_shift permite construirea unui accelerator de tipul <Ctrl>+<Shift>+<Tasta> (daca are valoarea true) Metode int getKey( ) Returneaza codul tastei folosite la construirea acceleratorului Atribuirea unui accelerator la o op]iune a unui meniu poate fi realizat\ prin: constructorul MenuItem in forma MenuItem(String eticheta, MenuShortcut accelerator) Ex: MenuItem m_optiune; m_optiune = new MenuItem(“Open”, new MenuShortcut(VK_O)) metoda setShortcut(MenuShortcut accelerator) a clasei MenuItem Ex: ctrl_o = new MenuShortcut(VK_O); MenuItem m_optiune = new MenuItem(“Open”, ctrl_o)