Meniuri

La fel ca listele sau butoanele radio, meniurile permit utilizatorului să aleagă una din mai multe opțiuni posibile. În JFC/Swing se disting două categorii de meniuri:
  - meniuri cu bară, care pornesc dintr-o bară situată la partea superioară a ferestrei aplicației;
  - meniuri derulante (pop-up), care apar în poziția în care se găsește cursorul de mouse.
 

Meniuri cu bară

Bara de meniu se poate plasa, daca este necesara, numai la partea superioara a ferstrei aplicatiei si se realizeaza ca o instanta a clasei javax.swing.JMenuBar.

Bara de meniu poate sa conțină unul sau mai multe meniuri, care se realizează ca instanțe ale clasei javax.swing.JMenu. La rândul său, fiecare meniu poate conține unul sau mai multe articole, care sunt instanțe ale claselor javax.swing.JMenuItem sau javax.swing.JCheckBoxMenuItem. Este însă posibil ca un articol de meniu să fie el însuși un meniu (din clasa JMenu). Dacă utilizatorul alege cu mouse-ul un aricol de meniu, sunt posibile deci două situații:
  - acesta este un articol propriu-zis (un JMenuItem), în care caz opțiunea respectivă este selectată;
  - articolul ales este el însuși un meniu (un JMenu), în care caz noul (sub)meniu se desfășoară și căutarea continuă.
 
Barele de meniu nu pot fi adăugate la un container ca niște componente obișnuite. Pentru a pune bara de meniu la partea superioară a ferestrei aplicației se folosește metoda clasei JFrame
    public void setJMenuBar(JMenuBar menubar)
Adăugarea de meniuri la bara de meniu se face prin metoda clasei JMenuBar
    public JMenu add(JMenu c)
iar adăugarea de articole sau submeniuri la un meniu se face prin metodele clasei JMenu
    public JMenuItem add(JMenuItem menuItem)
    public Component add(Component c)
    public JMenuItem add(String s)
    public JMenuItem add(Action a)
Pentru a introduce în meniu o linie orizontală de separare a două articole se folosește metoda
    public void addSeparator()

Atunci când este selectat un articol de meniu simplu (din clasa JMenuItem), acesta acționează ca un buton obișnuit, adică generează un eveniment de acțiune (ActionEvent). Dacă se selectează un articol de meniu sub forma de casetă de validare (din clasa JCheckBoxMenuItem), acesta se comporta ca o caseta de validare, adică generează un eveniment de articol (ItemEvent). Ascultarea acestor evenimente se face cu clase care implementează interfețele ActionListener, respectiv ItemListener.

Posibilitățile oferite de meniuri sunt mult mai bogate decât s-a arătat aici. Pentru aprofundare recomandăm consultarea capitolului How to Use Menus din Java Tutorial.
Exemplu
În fișierul Meniuri.java este dat un exemplu de aplicație cu bară de meniu. 
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Meniuri { 
 static AF af=new AF();
 static AA aa=new AA();
 static IUG iug=new IUG("O fereastra cu bara de menu");

 /* clasa imbricata pentru interfata utilizator grafica */
 static class IUG extends JFrame {
  JMenuBar menuBar;
  JMenu menu1, menu2;
  JLabel label;
  JMenuItem mi1, mi2, mi3, mi4, mi5;

  IUG(String titlu) { // constructorul clasei IUG
   super(titlu);
   setSize(350, 150);
   setLocation(200, 50);
   Container cp=getContentPane();
   addWindowListener(af);  // adaugarea ascultatorului de fereastra
   menuBar=new JMenuBar(); // se creeaza bara de menu
   setJMenuBar(menuBar); // bara de menu se adauga la fereastra 
   /* Se creeaza meniurile si se adauga la bara de meniu */
   menu1=new JMenu("Un menu");
   menuBar.add(menu1);
   menu2=new JMenu("Alt menu");
   menuBar.add(menu2);
   /* Se creaza articole de menu si se adauga la meniuri */
   mi1=new JMenuItem("A");
   mi1.addActionListener(aa);
   menu1.add(mi1);
   mi2=new JMenuItem("B");
   mi2.addActionListener(aa);
   menu1.add(mi2);
   mi3=new JMenuItem("C");
   mi3.addActionListener(aa);
   menu2.add(mi3);
   /* La menu2 se aduga un submeniu cu doua articole */
   JMenu menu3=new JMenu("Un submeniu");
   mi4=new JMenuItem("Alpha");
   mi4.addActionListener(aa);
   menu3.add(mi4);
   mi5=new JMenuItem("Beta");
   mi5.addActionListener(aa);
   menu3.add(mi5);
   menu2.add(menu3);

   /* Se creeaza o "eticheta" pentru afisarea mesajelor */
   label=new JLabel("Selectati articole de meniu si urmariti efectul");
   label.setBorder(BorderFactory.createTitledBorder(
      "Afisarea mesajelor privind selectarea articolelor de meniu"));
   cp.add(label, BorderLayout.SOUTH);

   setVisible(true);
  }
 } 

 /* Clasa ascultatoare de fereastra */ 
 static class AF extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
   System.exit(0); // incheierea executarii aplicatiei
  }
 }

 /* Ascultator de actiuni pentru articolele de menu */
 static class AA implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    iug.label.setText("A fost selectata optiunea: "+
         e.getActionCommand());
  }
 }

 /* Metoda principala a aplicatiei */
 public static void main(String args[]) {
 }
}

Meniuri volante (pop-up)

Spre deosebire de meniurile cu bară, meniurile volante sunt tratate ca niște componente obișnuite, care pot să fie afișate prin program, atunci când este necesar. În JFC/Swing, meniurile volante se realizează ca instanțe ale clasei javax.swing.JPopupMenu. În rest, meniul pop-up se comportă la fel ca un meniu cu bară.
 
Afișarea meniului pop-up trebuie programată, folosindu-se în acest scop metoda din clasa JPopupMenu
    public void show(Component invoker, int x, int y)
în care invoker este referința la componenta in spațiul căreia trebuie să apară meniul, iar x și y sunt coordonatele punctului în care acesta va fi afișat.

De obicei, se doreste ca afișarea meniului pop-up să se facă atunci când se efectuează o anumită acțiune a mouse-lui asupra componentei respective. În acest scop, se creează o clasă ascultătoare de mouse (care implementează interfața MouseListener sau extinde clasa MouseAdapter) și - în corpul metodei corespunzatoare situației în care trebuie să se afișeze meniul (mousePressed, mouseReleased sau mouseClicked) se invocă metoda show menționată mai sus, dacă a fost acționat butonul de mouse care ne interesează. Se demonstrează acest procedeu în exemplul de mai jos.

Exemplu

În fișierul Popup.java se dă un exemplu de aplicație în care se testează utilizarea unui menu pop-up. Drept componentă pe suprafața căreia trebuie să apară meniul s-a ales eticheta de la partea inferioară a ferestrei aplicației. Evenimentul care declanșează apariția meniului este apăsarea pe butonul din dreapta al mouse-ului, atunci când acesta se găsește în spațiul ferestrei. Acest eveniment este urmărit de instanța  clasei AfisPopup, care este atașata etichetei label în calitate de ascultător de mouse.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Popup { 
 static AF af=new AF();
 static AA aa=new AA();
 static AfisPopup afisare=new AfisPopup();
 static IUG iug=new IUG("Exemplu de menu pop-up");

 /* clasa imbricata pentru interfata utilizator grafica */
 static class IUG extends JFrame {
  JPopupMenu popup;
  JLabel label;
  JMenuItem mi1, mi2, mi3;

  IUG(String titlu) { // constructorul clasei IUG
   super(titlu);
   setSize(350, 150);
   setLocation(200, 50);
   Container cp=getContentPane();
   addWindowListener(af);  // adaugarea ascultatorului de fereastra

   /* Se creeaza meniul pop-up */
   popup=new JPopupMenu();

   /* Se creaza articole de menu si se adauga la meniuri */
   mi1=new JMenuItem("A");
   mi1.addActionListener(aa);
   popup.add(mi1);
   mi2=new JMenuItem("B");
   mi2.addActionListener(aa);
   popup.add(mi2);
   mi3=new JMenuItem("C");
   mi3.addActionListener(aa);
   popup.add(mi3);

   /* Se creeaza o "eticheta" pentru afisarea mesajelor */
   label=new JLabel("
     Apasati pe aceasta eticheta butonul drept al mouse-ului");
   label.setBorder(BorderFactory.createTitledBorder(
      "Afisarea mesajelor privind selectarea articolelor de meniu"));
   cp.add(label, BorderLayout.SOUTH);

   /* Se adauga la eticheta label ascultatorul de mouse pentru 
      afisarea meniului popup
   */
   label.addMouseListener(afisare);
   setVisible(true);
  }
 } 

 /* Clasa ascultatoare de fereastra */ 
 static class AF extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
   System.exit(0); // incheierea executarii aplicatiei
  }
 }

 /* Clasa ascultatoare de mouse pentru afisarea meniului pop-up */
 static class AfisPopup extends MouseAdapter {
  public void mousePressed(MouseEvent e) {
   if((e.getModifiers()&InputEvent.BUTTON3_MASK)!=0)
    iug.popup.show(e.getComponent(), e.getX(), e.getY()); 
  }
 }

 /* Ascultator de actiuni pentru articolele de menu */
 static class AA implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    iug.label.setText("A fost selectata optiunea: "+
         e.getActionCommand());
  }
 }

 /* Metoda principala a aplicatiei */
 public static void main(String args[]) {
 }
}



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați