Sei sulla pagina 1di 14

Componenti swing: i menu ______________________________________________________

Gerarchia di classi per i menu


Le classi evidenziate in grigio sono impiegate per creare e gestire i menu.

java.lang.Object

j ava.awt.Com ponent

java.awt.Container

javax.swi ng.JCom ponent

j av ax.swing.JMenuBar

javax.swing.AbstractButton

j av ax.swing.JMenuItem

j av ax.swing.JMenu

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

Struttura di un menu
Un menu costituito da: una barra del menu, uno o pi menu, una o pi voci di menu per ciascun menu, eventuali sottomenu. Due menu

La barra del menu

un sottomenu

Le voci di un menu

Figura 1. Immagine tratta da The Java Tutorials - How to Use Menus url: http://download.oracle.com/javase/tutorial/uiswing/components/menu.html

La barra del menu gestita mediante la classe JMenuBar. La posizione in cui viene collocata la barra di menu dipende dalla piattaforma in uso. Solitamente si trova sotto la barra del titolo della finestra. I menu sono gestiti mediante la classe JMenu. Un menu pu avere icone vicino alle voci e sottomenu. Pu anche essere pop up. Inoltre, possibile impostare per esso colori e font. Le voci di menu sono gestite mediante la classe JMenuItem.

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

Creare un menu
Supponiamo di voler creare una barra di menu con 1 menu. Il menu ha 2 voci: voce 1 e voce 2. Definiamo i componenti del menu Per prima cosa definiamo la barra del menu come istanza della classe JMenuBar: JMenuBar menuBar; Poi definiamo il menu come istanza della classe JMenu: JMenu menu; Infine, definiamo tutte le voci di menu come istanze di JMenuItem: JMenuItem voce1; JMenuItem voce 2; Creiamo i componenti del menu Creiamo la barra di menu usando il costruttore di JMenuBar, la cui firma :

public JMenuBar()
menuBar = new JMenuBar(); Creiamo il menu con il costruttore di JMenu la cui firma :

public JMenu(String testodelmenu)


menu = new JMenu (Unmenu); Ora aggiungiamo le voci del menu; i costruttori utilizzabili sono diversi:

public JMenuItem(Icon icon)

public JMenuItem(String text)


3

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

public JMenuItem(String text, Icon icon)

public JMenuItem(String text, int mnemonic)


dove mnemonic la combinazione di tasti da utilizzare voce1 = new JMenuItem (Voce 1); voce2 = new JMenuItem (Voce 2); Aggiungiamo i componenti Aggiungiamo le voci di menu al menu utilizzando il metodo add della classe JMenu:

public Component add(Component c)


Aggiunge il componente alla fine del menu. Restituisce il componente aggiunto. menu.add(voce1); menu.add(voce2); Aggiungiamo il menu alla barra del menu utilizzando il metodo add della classe JMenuBar:

public JMenu add(JMenu c)


Aggiunge il menu specificato al fondo della barra del menu. menuBar.add(menu); Aggiungiamo la barra del menu al frame Utilizziamo a tal scopo il metodo setJMenuBar della classe JMenuBar:

public void setJMenuBar(JMenuBar menubar)


Imposta la menubar per il frame.

Altri metodi utili di JMenu


Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

public void addSeparator() Aggiunge un separatore.

Altri metodi di JmenuItem


public void setEnabled(boolean b) Abilita o disabilita le voci di menu.

Esempio: creazione di una menubar


Lesempio crea una menubar con tre menu File, Modifica e Formato, tali che il menu File contiene le voci Nuovo, Apri, Salva, Chiudi, il menu Modifica contiene le voci Taglia, Copia e Incolla, il menu Formato contiene la voce Carattere.

Figura 2. Frame con una menubar import import import import javax.swing.JFrame; javax.swing.JMenu; javax.swing.JMenuBar; javax.swing.JMenuItem;

@SuppressWarnings("serial") public class MenuFrame extends JFrame { public static final int WIDTH = 250; public static final int HEIGHT = 150; public MenuFrame(){ //il frame super("Esempio Menu"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //componenti del menu JMenuBar menubar = new JMenuBar(); //la menubar JMenu file = new JMenu("File"); //menu File JMenu modifica = new JMenu("Modifica"); //menu Modifica JMenu formato = new JMenu("Formato"); //menu Formato JMenuItem nuovo = new JMenuItem("Nuovo"); //item Nuovo JMenuItem apri = new JMenuItem("Apri"); //item Apri JMenuItem salva = new JMenuItem("Salva"); //item Salva JMenuItem chiudi = new JMenuItem("Chiudi"); //item Chiudi Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

JMenuItem JMenuItem JMenuItem JMenuItem

taglia = new JMenuItem("Taglia"); //item Taglia copia = new JMenuItem("Copia"); //item Copia incolla = new JMenuItem("Incolla"); //item Incolla carattere = new JMenuItem("Carattere"); //item Carattere

//inserimento degli item nel menu File file.add(nuovo); file.add(apri); file.add(salva); file.addSeparator(); file.add(chiudi); //inserimento degli item nel menu Modifica modifica.add(taglia); modifica.add(copia); modifica.add(incolla); //inserimento degli item nel menu Formato formato.add(carattere); //inserimento dei menu nella menubar menubar.add(file); menubar.add(modifica); menubar.add(formato); //inserimento della menubar nel frame setJMenuBar(menubar); } public static void main(String[] args){ MenuFrame frame = new MenuFrame(); frame.setVisible(true); } }

Scorciatoie da tastiera
I menu supportano due tipi di scorciatoie da tastiera: mnemonic e acceleratori. Lalternativa mnemonic consente di utilizzare la tastiera per navigare, aumentando cos laccessibilit. Uno mnemonic una chiave che permette di scegliere una voce di menu tra quelle visibili. Per esempio, quasi tutti i menu File hanno come mnemonic la lettera F; ce ne accorgiamo perch la lettera appare sottolineata. Premendo la combinazione di tasti ALT + MNEMONIC, possiamo aprire il menu senza usare il mouse. Lalternativa rappresentata dagli acceleratori offre delle scorciatoie da tastiera per scegliere delle voci di menu, indipendentemente dal fatto che esse siano visibili. Un acceleratore una combinazione di chiavi del tipo CTRL + MAIUSC + 2. Gli acceleratori possono essere assegnati solo alle voci di menu che non rappresentano sotto-menu (sono dette foglie). La combinazione di chiavi di un acceleratore viene mostrata nel menu, alla destra della voce che rappresenta.

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

Per impostare uno mnemonic per una voce di menu menuItem, occorre scrivere, in fase di creazione del menu:
menuItem = new JMenuItem("Item", KeyEvent.VK_I);

dove la lettera I la lettera della voce di menu che apparir sottolineata. In alternativa, si pu utilizzare il metodo setMnemonic, dopo aver creato la voce di menu; questo metodo, inoltre, utilizzabile anche con i menu (non solo con gli item).
menuItem.setMnemonic(KeyEvent.VK_I);

Per impostare un acceleratore occorre scrivere:


menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_T, ActionEvent.ALT_MASK));

oppure
menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_T, ActionEvent.CRTL_MASK));

o, ancora
menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_T, ActionEvent.SHIFT_MASK));

sulla base del tasto che deve essere premuto insieme a quello indicato dalla costante di KeyEvent. Nella figura seguente rappresentato il frame della figura 2 dopo le modifiche apportate dallinserimento di scorciatoie da tastiera.

Figura 3. Frame con una menubar e scorciatoie da tastiera

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

Esempio: utilizzo di scorciatoie da tastiera


import import import import import import import java.awt.event.ActionEvent; java.awt.event.KeyEvent; javax.swing.JFrame; javax.swing.JMenu; javax.swing.JMenuBar; javax.swing.JMenuItem; javax.swing.KeyStroke;

@SuppressWarnings("serial") public class MenuFrame extends JFrame { public static final int WIDTH = 250; public static final int HEIGHT = 150; public MenuFrame(){ //il frame super("Esempio Menu"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //componenti del menu JMenuBar menubar = new JMenuBar(); //la menubar JMenu file = new JMenu("File"); //menu File JMenu modifica = new JMenu("Modifica"); //menu Modifica JMenu formato = new JMenu("Formato"); //menu Formato JMenuItem nuovo = new JMenuItem("Nuovo"); //item Nuovo JMenuItem apri = new JMenuItem("Apri"); //item Apri JMenuItem salva = new JMenuItem("Salva"); //item Salva JMenuItem chiudi = new JMenuItem("Chiudi"); //item Chiudi JMenuItem taglia = new JMenuItem("Taglia"); //item Taglia JMenuItem copia = new JMenuItem("Copia"); //item Copia JMenuItem incolla = new JMenuItem("Incolla"); //item Incolla JMenuItem carattere = new JMenuItem("Carattere"); //item Carattere //mnemonic file.setMnemonic(KeyEvent.VK_F); modifica.setMnemonic(KeyEvent.VK_M); formato.setMnemonic(KeyEvent.VK_R); nuovo.setMnemonic(KeyEvent.VK_N); apri.setMnemonic(KeyEvent.VK_A); salva.setMnemonic(KeyEvent.VK_S); chiudi.setMnemonic(KeyEvent.VK_C); taglia.setMnemonic(KeyEvent.VK_T); copia.setMnemonic(KeyEvent.VK_P); incolla.setMnemonic(KeyEvent.VK_I); carattere.setMnemonic(KeyEvent.VK_C); //accelerator nuovo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK)); apri.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK)); salva.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); chiudi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

taglia.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, ActionEvent.CTRL_MASK)); copia.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK)); incolla.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, ActionEvent.CTRL_MASK)); carattere.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); //inserimento degli item nel menu File file.add(nuovo); file.add(apri); file.add(salva); file.addSeparator(); file.add(chiudi); //inserimento degli item nel menu Modifica modifica.add(taglia); modifica.add(copia); modifica.add(incolla); //inserimento degli item nel menu Formato formato.add(carattere); //inserimento dei menu nella menubar menubar.add(file); menubar.add(modifica); menubar.add(formato); //inserimento della menubar nel frame setJMenuBar(menubar); } public static void main(String[] args){ MenuFrame frame = new MenuFrame(); frame.setVisible(true); } }

Barre degli strumenti (toolbar)


Una toolbar un contenitore che raggruppa diversi componenti, solitamente pulsanti con icone, in una riga o colonna. Generalmente una toolbar consente di accedere pi agevolmente a tutte o alcune delle funzionalit presenti nei menu. Per impostazione predefinita, una toolbar pu essere trascinata verso un altro lato del suo contenitore o fuori di esso. Per consentire il corretto funzionamento del trascinamento, il contenitore della toolbar deve avere come layout manager BorderLayout. Inoltre, la toolbar deve essere lunico componente del suo stesso contenitore. Il codice per creare una toolbar simile al seguente:
1 2 3 4 5 JToolBar toolbar = new JToolBar(); Icon icon = new ImageIcon("immagine.gif"); JButton b = new JButton(icon); toolbar.add(b); getContentPane().add(toolbar, BorderLayout.NORTH);

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

Rigo 1: crea la toolbar come istanza della classe JToolBar. Rigo 2: crea una icona a partire dallimmagine specificata come parametro (altri formati consentiti: png, jpg). Rigo 3: crea un pulsante con licona. Rigo 4: aggiunge il pulsante alla toolbar. Rigo 5: aggiunge la toolbar al contentPane, nellarea NORTH. Per quanto riguarda le immagini da utilizzare per le icone, possibile scaricare interi pacchetti dal web oppure utilizzare i pulsanti con look and feel Java, scaricabili allurl http://java.sun.com/developer/techDocs/hi/repository/ Attenzione! Se si desidera che le icone siano visualizzate correttamente anche dopo aver esportato il progetto creato, occorre adottare il seguente accorgimento: 1. inserire le immagini allinterno di una cartella interna al progetto, per esempio la cartella img 2. sostituire il codice del rigo 2 con
Icon icon = new ImageIcon(getClass().getClassLoader().getResource("img/immagine.gif"));

Metodi utili della classe JToolBar


public void setFloatable(boolean b) Se il parametro false, rende la toolbar non trascinabile in altre aree del contenitore o fuori di esso. public void setRollover(boolean rollover) Se il parametro true, il contorno dei pulsanti viene disegnato solo quando ci si posiziona su di essi con il puntatore del mouse. public void addSeparator() Aggiunge un separatore.

Metodi utili della classe JComponent


public void setToolTipText(String text) Consente di specificare il testo che deve essere visualizzato quando ci si posiziona su di essi con il puntatore del mouse.

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

10

Esempio: aggiunta di una toolbar


Il seguente esempio mostra come aggiungere una toolbar al frame di figura 3. Il pulsanti della toolbar corrispondono alle voci di menu File>Nuovo, File>Apri, File>Salva, Modifica>Copia, Modifica>Taglia, Modifica>Incolla. I pulsanti del menu File sono separati visivamente da quelli del menu Modifica mediante un separatore. Dotiamo i pulsanti di una funzione rollover e aggiungiamo i tooltip. La toolbar contiene anche una combobox per la scelta del font, che corrisponde alla voce di menu Formato>Carattere.

Figura 4. Frame con menubar e toolbar

import import import import import import import import import import import import import

java.awt.BorderLayout; java.awt.event.ActionEvent; java.awt.event.KeyEvent; javax.swing.Icon; javax.swing.ImageIcon; javax.swing.JButton; javax.swing.JComboBox; javax.swing.JFrame; javax.swing.JMenu; javax.swing.JMenuBar; javax.swing.JMenuItem; javax.swing.JToolBar; javax.swing.KeyStroke;

@SuppressWarnings("serial") public class MenuFrame extends JFrame { public static final int WIDTH = 350; public static final int HEIGHT = 250; public MenuFrame(){ //il frame super("Esempio Menu"); setSize(WIDTH, HEIGHT); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

11

//********************* MENUBAR *********************************** //componenti del menu JMenuBar menubar = new JMenuBar(); //la menubar JMenu file = new JMenu("File"); //menu File JMenu modifica = new JMenu("Modifica"); //menu Modifica JMenu formato = new JMenu("Formato"); //menu Formato JMenuItem nuovo = new JMenuItem("Nuovo"); //item Nuovo JMenuItem apri = new JMenuItem("Apri"); //item Apri JMenuItem salva = new JMenuItem("Salva"); //item Salva JMenuItem chiudi = new JMenuItem("Chiudi"); //item Chiudi JMenuItem taglia = new JMenuItem("Taglia"); //item Taglia JMenuItem copia = new JMenuItem("Copia"); //item Copia JMenuItem incolla = new JMenuItem("Incolla"); //item Incolla JMenuItem carattere = new JMenuItem("Carattere"); //item Carattere //mnemonic file.setMnemonic(KeyEvent.VK_F); modifica.setMnemonic(KeyEvent.VK_M); formato.setMnemonic(KeyEvent.VK_R); nuovo.setMnemonic(KeyEvent.VK_N); apri.setMnemonic(KeyEvent.VK_A); salva.setMnemonic(KeyEvent.VK_S); chiudi.setMnemonic(KeyEvent.VK_C); taglia.setMnemonic(KeyEvent.VK_T); copia.setMnemonic(KeyEvent.VK_P); incolla.setMnemonic(KeyEvent.VK_I); carattere.setMnemonic(KeyEvent.VK_C); //accelerator nuovo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK)); apri.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK)); salva.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); chiudi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); taglia.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, ActionEvent.CTRL_MASK)); copia.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK)); incolla.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, ActionEvent.CTRL_MASK)); carattere.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); //inserimento degli item nel menu File file.add(nuovo); file.add(apri); file.add(salva); file.addSeparator(); file.add(chiudi); //inserimento degli item nel menu Modifica modifica.add(taglia); modifica.add(copia); modifica.add(incolla); //inserimento degli item nel menu Formato Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

12

formato.add(carattere); //inserimento dei menu nella menubar menubar.add(file); menubar.add(modifica); menubar.add(formato); //inserimento della menubar nel frame setJMenuBar(menubar); //********************* TOOLBAR *********************************** //creazione delle icone Icon nuovoIcon = new ImageIcon(getClass().getClassLoader().getResource("icons/New16.gif")); Icon apriIcon = new ImageIcon(getClass().getClassLoader().getResource("icons/Open16.gif")); Icon salvaIcon = new ImageIcon(getClass().getClassLoader().getResource("icons/Save16.gif")); Icon tagliaIcon = new ImageIcon(getClass().getClassLoader().getResource("icons/Cut16.gif")); Icon copiaIcon = new ImageIcon(getClass().getClassLoader().getResource("icons/Copy16.gif")); Icon incollaIcon = new ImageIcon(getClass().getClassLoader().getResource("icons/Paste16.gif")); //creazione dei pulsanti JButton nuovoButton = new JButton(nuovoIcon); JButton apriButton = new JButton(apriIcon); JButton salvaButton = new JButton(salvaIcon); JButton tagliaButton = new JButton(tagliaIcon); JButton copiaButton = new JButton(copiaIcon); JButton incollaButton = new JButton(incollaIcon); //creazione della combobox String[] font = {"Arial", "Courier", "Times New Roman", "Verdana"}; JComboBox<String> fontList = new JComboBox<String>(font); //creazione della toolbar con pulsanti rollover JToolBar toolbar = new JToolBar(); toolbar.setRollover(true); //inserimento dei pulsanti e della combobox nella toolbar toolbar.add(nuovoButton); toolbar.add(apriButton); toolbar.add(salvaButton); toolbar.addSeparator(); toolbar.add(tagliaButton); toolbar.add(copiaButton); toolbar.add(incollaButton); toolbar.addSeparator(); toolbar.add(fontList); //aggiunta dei tooltip ai pulsanti nuovoButton.setToolTipText("Nuovo"); apriButton.setToolTipText("Apri"); salvaButton.setToolTipText("Salva"); tagliaButton.setToolTipText("Taglia"); copiaButton.setToolTipText("Copia"); incollaButton.setToolTipText("Incolla");

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

13

//inserimento della toolbar nel frame getContentPane().add(toolbar, BorderLayout.NORTH); } public static void main(String[] args){ MenuFrame frame = new MenuFrame(); frame.setVisible(true); } }

Nota: le immagini sono state salvate nella cartella icons e questa stata inserita nella cartella src del progetto. Lide utilizzato Eclipse.

________________________________________________________________________________
Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Bocchi Cinzia Ultimo aggiornamento: 10/11/2011

14