LES LES MENUS MENUS Par Par convention, convention, les les menus menus ne ne sont sont pas pas placés placés dans dans d'autres d'autres composants composants de de l'interface l'interface Æ Æ pas pas d'ajout d'ajout au au content content pane. pane. Ils Ils apparaissent apparaissent soit soit dans dans une une barre barre de de menus, menus, soit soit dans dans un un menu menu contextuel. contextuel. frame.setJMenuBar(demo.creationBarreMenu()); frame.setJMenuBar(demo.creationBarreMenu()); JPopupMenu JPopupMenu popup popup == new new JPopupMenu(); JPopupMenu(); public void setJMenuBar(JMenuBar menuBarre) positionne la barre de menus pour une fenêtre (Frame) Paramètre: menuBarre – la barre de menu à placer dans la Frame. 1-248 JAVA Christine BONNET HIÉRARCHIE HIÉRARCHIE DE DE COMPOSANTS COMPOSANTS D'UN D'UN MENU MENU •• •• •• •• •• •• JMenuBar JMenuBar :: sert sert àà créer créer une une barre barre de de menus menus JPopupMenu JPopupMenu :: sert sert àà créer créer un un menu menu contextuel contextuel JMenuItem JMenuItem :: sert sert àà créer créer un un item item de de menu menu JMenu JMenu :: sert sert àà créer créer un un menu menu JCheckBoxMenuItem JCheckBoxMenuItem :: item item de de menu menu àà cocher cocher JRadioButtonMenuItem JRadioButtonMenuItem :: item item avec avec une une puce puce radio radio 1-249 JAVA Christine BONNET EXEMPLE EXEMPLE :: EXÉCUTION EXÉCUTION 1-250 JAVA Christine BONNET EXEMPLE EXEMPLE :: CODE CODE import import java.awt.*; java.awt.*; import import java.awt.event.*; java.awt.event.*; import import javax.swing.*; javax.swing.*; public public class class MenuDemo MenuDemo {{ public public JMenuBar JMenuBar creationBarreMenu() creationBarreMenu() {{ JMenuBar JMenuBar barreMenu; barreMenu; JMenu JMenu menu, menu, submenu; submenu; JMenuItem JMenuItem menuItem; menuItem; JRadioButtonMenuItem JRadioButtonMenuItem rbMenuItem; rbMenuItem; JCheckBoxMenuItem JCheckBoxMenuItem cbMenuItem; cbMenuItem; // // Création Création de de la la barre barre de de menu menu barreMenu barreMenu == new new JMenuBar(); JMenuBar(); // // Premier Premier menu menu menu menu == new new JMenu("Un JMenu("Un Menu"); Menu"); menu.setMnemonic(KeyEvent.VK_U); menu.setMnemonic(KeyEvent.VK_U); barreMenu.add(menu); barreMenu.add(menu); 1-251 JAVA Christine BONNET // // Un Un groupe groupe d'items d'items de de JMenuItem JMenuItem menuItem menuItem == new new JMenuItem("Un JMenuItem("Un item item de de menu menu texte", texte", KeyEvent.VK_T); KeyEvent.VK_T); menuItem.setAccelerator(KeyStroke.getKeyStroke( menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_1, KeyEvent.VK_1, ActionEvent.ALT_MASK)); ActionEvent.ALT_MASK)); menu.add(menuItem); menu.add(menuItem); ImageIcon ImageIcon icon icon == new new ImageIcon("ImagesProgJava/Gif2/middle.gif"); ImageIcon("ImagesProgJava/Gif2/middle.gif"); menuItem menuItem == new new JMenuItem("Texte JMenuItem("Texte et et icône", icône", icon); icon); menuItem.setMnemonic(KeyEvent.VK_I); menuItem.setMnemonic(KeyEvent.VK_I); menu.add(menuItem); menu.add(menuItem); menuItem menuItem == new new JMenuItem(icon); JMenuItem(icon); menu.add(menuItem); menu.add(menuItem); 1-252 JAVA Christine BONNET // // Un Un groupe groupe de de boutons boutons radio radio de de menu menu menu.addSeparator(); menu.addSeparator(); //// dessine dessine une une ligne ligne de de séparation séparation dans dans le le menu menu ButtonGroup ButtonGroup group group == new new ButtonGroup(); ButtonGroup(); rbMenuItem rbMenuItem == new new JRadioButtonMenuItem("Un JRadioButtonMenuItem("Un item item de de bouton bouton radio radio de de menu"); menu"); rbMenuItem.setSelected(true); rbMenuItem.setSelected(true); rbMenuItem.setMnemonic(KeyEvent.VK_R); rbMenuItem.setMnemonic(KeyEvent.VK_R); group.add(rbMenuItem); group.add(rbMenuItem); menu.add(rbMenuItem); menu.add(rbMenuItem); rbMenuItem rbMenuItem == new new JRadioButtonMenuItem("Un JRadioButtonMenuItem("Un autre"); autre"); rbMenuItem.setMnemonic(KeyEvent.VK_U); rbMenuItem.setMnemonic(KeyEvent.VK_U); rbMenuItem.addActionListener(new rbMenuItem.addActionListener(new MonActionListener()); MonActionListener()); group.add(rbMenuItem); group.add(rbMenuItem); menu.add(rbMenuItem); menu.add(rbMenuItem); // // Un Un groupe groupe d'items d'items de de cases cases àà cocher cocher menu.addSeparator(); menu.addSeparator(); cbMenuItem cbMenuItem == new new JCheckBoxMenuItem("Un JCheckBoxMenuItem("Un item item de de case case àà cocher cocher de de menu"); menu"); cbMenuItem.setMnemonic(KeyEvent.VK_C); cbMenuItem.setMnemonic(KeyEvent.VK_C); menu.add(cbMenuItem); menu.add(cbMenuItem); cbMenuItem cbMenuItem == new new JCheckBoxMenuItem("Un JCheckBoxMenuItem("Un autre"); autre"); cbMenuItem.setMnemonic(KeyEvent.VK_N); cbMenuItem.setMnemonic(KeyEvent.VK_N); menu.add(cbMenuItem); menu.add(cbMenuItem); 1-253 JAVA Christine BONNET // // Un Un sous-menu sous-menu menu.addSeparator(); menu.addSeparator(); submenu submenu == new new JMenu("Un JMenu("Un sous-menu"); sous-menu"); submenu.setMnemonic(KeyEvent.VK_S); submenu.setMnemonic(KeyEvent.VK_S); menuItem menuItem == new new JMenuItem("Un JMenuItem("Un item item dans dans le le sous-menu"); sous-menu"); menuItem.setAccelerator(KeyStroke.getKeyStroke( menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_2, KeyEvent.VK_2, ActionEvent.ALT_MASK)); ActionEvent.ALT_MASK)); submenu.add(menuItem); submenu.add(menuItem); menuItem menuItem == new new JMenuItem("Un JMenuItem("Un autre autre item"); item"); submenu.add(menuItem); submenu.add(menuItem); menu.add(submenu); menu.add(submenu); // // Deuxième Deuxième menu menu dans dans la la barre barre de de menus menus menu menu == new new JMenu("Un JMenu("Un autre autre menu"); menu"); menu.setMnemonic(KeyEvent.VK_N); menu.setMnemonic(KeyEvent.VK_N); barreMenu.add(menu); barreMenu.add(menu); return return barreMenu; barreMenu; }} public public Container Container creationContentPane() creationContentPane() {{ // // Création Création du du content content pane pane :: JPanel JPanel JPanel JPanel contentPane contentPane == new new JPanel(new JPanel(new BorderLayout()); BorderLayout()); return return contentPane; contentPane; }} 1-254 JAVA Christine BONNET public public class class MonActionListener MonActionListener implements implements ActionListener ActionListener {{ public public void void actionPerformed(ActionEvent actionPerformed(ActionEvent e) e) {{ JMenuItem JMenuItem source source == (JMenuItem)(e.getSource()); (JMenuItem)(e.getSource()); JDialog JDialog jD jD == new new JDialog(); JDialog(); JLabel JLabel j1; j1; if if (source.getText() (source.getText() == == "Un "Un autre") autre") {{ j1 j1 == new new JLabel("Vous JLabel("Vous avez avez choisi choisi un un item item de de bouton bouton radio"); radio"); }} else else if if ………etc. ………etc. jD.setBounds(100,50, jD.setBounds(100,50, 250,200); 250,200); jD.getContentPane().add(j1); jD.getContentPane().add(j1); jD.show(); jD.show(); }} }} public public static static void void main(String[] main(String[] args) args) {{ JFrame JFrame frame frame == new new JFrame("Menu JFrame("Menu de de démonstration"); démonstration"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // // Création Création du du content content pane pane MenuDemo MenuDemo demo demo == new new MenuDemo(); MenuDemo(); frame.setJMenuBar(demo.creationBarreMenu()); frame.setJMenuBar(demo.creationBarreMenu()); frame.setContentPane(demo.creationContentPane()); frame.setContentPane(demo.creationContentPane()); frame.setSize(450, frame.setSize(450, 260); 260); frame.setVisible(true); frame.setVisible(true); }} }} 1-255 JAVA Christine BONNET LES LES BARRES BARRES D'OUTILS D'OUTILS classe classe JToolBar JToolBar •• Une Une barre barre d'outils d'outils JToolBar JToolBar est est un un conteneur conteneur qui qui groupe groupe généralement généralement des des boutons boutons avec avec des des icônes icônes dans dans une une ligne ligne ou ou une une colonne. colonne. •• Une Une barre barre d'outils d'outils facilite facilite l'accès l'accès aux aux fonctionnalités fonctionnalités de de l'application. l'application. •• Par Par défaut défaut la la barre barre d'outils d'outils peut peut être être tirée tirée ("drag") ("drag") sur sur un un des des bords bords de de son son conteneur conteneur ou ou en en dehors dehors de de la la fenêtre fenêtre de de base. base. Le Le conteneur conteneur doit doit alors alors utiliser utiliser la la présentation présentation BorderLayout. BorderLayout. La La barre barre d'outils d'outils ne ne doit doit pas pas être être dans dans le le centre. centre. 1-256 JAVA Christine BONNET EXEMPLE EXEMPLE :: EXÉCUTION EXÉCUTION 1-257 JAVA Christine BONNET import import …………. …………. EXEMPLE EXEMPLE :: CODE CODE public public class class ToolBarDemo ToolBarDemo extends extends JPanel JPanel implements implements ActionListener ActionListener {{ protected protected JTextArea JTextArea textArea; textArea; protected protected String String newline newline == "\n"; "\n"; static static final final private private String String PREVIOUS PREVIOUS == "précédent"; "précédent"; static static final final private private String String UP UP == "haut"; "haut"; static static final final private private String String NEXT NEXT == "suivant"; "suivant"; public public ToolBarDemo() ToolBarDemo() {{ super(new super(new BorderLayout()); BorderLayout()); // // Création Création de de la la barre barre d'outils d'outils JToolBar JToolBar toolBar toolBar == new new JToolBar(); JToolBar(); ajoutBoutons(toolBar); ajoutBoutons(toolBar); // // Création Création de de la la zone zone de de texte texte pour pour les les affichages affichages // // espace espace suffisant suffisant pour pour 55 lignes lignes et et 30 30 colonnes colonnes textArea textArea == new new JTextArea(5, JTextArea(5, 30); 30); textArea.setEditable(false); textArea.setEditable(false); JScrollPane JScrollPane scrollPane scrollPane == new new JScrollPane(textArea); JScrollPane(textArea); // // Ajout Ajout au au panel panel principal principal setPreferredSize(new setPreferredSize(new Dimension(450, Dimension(450, 130)); 130)); add(toolBar, add(toolBar, BorderLayout.BEFORE_FIRST_LINE); BorderLayout.BEFORE_FIRST_LINE); add(scrollPane, add(scrollPane, BorderLayout.CENTER); BorderLayout.CENTER); }} 1-258 JAVA Christine BONNET protected protected void void ajoutBoutons(JToolBar ajoutBoutons(JToolBar toolBar) toolBar) {{ JButton JButton bouton bouton == null; null; // // Premier Premier bouton bouton bouton bouton == creerBoutonDeNavigation("prev.gif", creerBoutonDeNavigation("prev.gif", PREVIOUS, PREVIOUS, "Niveau "Niveau Précédent"); Précédent"); toolBar.add(bouton); toolBar.add(bouton); // // Deuxième Deuxième bouton bouton bouton bouton == creerBoutonDeNavigation("upArrow.gif", creerBoutonDeNavigation("upArrow.gif", UP, UP, "Haut "Haut de de Page"); Page"); toolBar.add(bouton); toolBar.add(bouton); // // Troisième Troisième bouton bouton bouton bouton == creerBoutonDeNavigation("next.gif", creerBoutonDeNavigation("next.gif", NEXT, NEXT, "Niveau "Niveau Suivant"); Suivant"); toolBar.add(bouton); toolBar.add(bouton); }} 1-259 JAVA Christine BONNET protected protected JButton JButton creerBoutonDeNavigation(String creerBoutonDeNavigation(String imageName, imageName, String String actionCommand, actionCommand, String String toolTipText) toolTipText) {{ // // Création Création et et initialisation initialisation des des boutons. boutons. JButton JButton bouton bouton == new new JButton(); JButton(); bouton.setActionCommand(actionCommand); bouton.setActionCommand(actionCommand); bouton.setToolTipText(toolTipText); bouton.setToolTipText(toolTipText); // // info-bulle info-bulle bouton.addActionListener(this); bouton.addActionListener(this); bouton.setIcon(new bouton.setIcon(new ImageIcon(imageName)); ImageIcon(imageName)); return return bouton; bouton; }} public public void void actionPerformed(ActionEvent actionPerformed(ActionEvent e) e) {{ String String cmd cmd == e.getActionCommand(); e.getActionCommand(); String String description description == null; null; // // Gestion Gestion de de chaque chaque bouton bouton if if (PREVIOUS.equals(cmd)) (PREVIOUS.equals(cmd)) {{ // // premier premier bouton bouton cliqué cliqué description description == "été "été au au niveau niveau précédent précédent <quelque <quelque chose>."; chose>."; }} else else if if (UP.equals(cmd)) (UP.equals(cmd)) {{ // // deuxième deuxième bouton bouton cliqué cliqué description description == "été "été au au début début de de <something>."; <something>."; }} else else if if (NEXT.equals(cmd)) (NEXT.equals(cmd)) {{ // // troisième troisième bouton bouton cliqué cliqué description description == "été "été au au niveau niveau suivant suivant <quelque <quelque chose>."; chose>."; }} afficheResultat("Dans afficheResultat("Dans une une véritable véritable application application vous vous auriez auriez "" ++ description); description); }} 1-260 JAVA Christine BONNET protected protected void void afficheResultat(String afficheResultat(String textArea.append(actionDescription textArea.append(actionDescription }} actionDescription) actionDescription) {{ ++ newline); newline); public public static static void void main(String[] main(String[] args) args) {{ JFrame JFrame frame frame == new new JFrame("Barre JFrame("Barre d'outils d'outils Démonstration"); Démonstration"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ToolBarDemo ToolBarDemo newContentPane newContentPane == new new ToolBarDemo(); ToolBarDemo(); frame.setContentPane(newContentPane); frame.setContentPane(newContentPane); frame.pack(); frame.pack(); frame.setVisible(true); frame.setVisible(true); }} }} 1-261 JAVA Christine BONNET 18 COMPLÉMENTS 1-262 JAVA Christine BONNET PERSONNALISATION PERSONNALISATION DE DE L’APPARENCE L’APPARENCE DES DES COMPOSANTS COMPOSANTS Encadrements Encadrements (Borders) (Borders) :: espacements, espacements, titres titres •• Les Les bordures bordures sont sont des des objets. objets. •• Pour Pour créer créer des des bordures bordures utilisation utilisation de de la la classe classe BorderFactory. BorderFactory. •• Pour Pour affecter affecter une une bordure bordure àà un un composant composant (JComponent): (JComponent): méthode méthode setBorder() setBorder() Pour Pour utiliser utiliser la la même même bordure bordure pour pour plusieurs plusieurs composants composants Æ Æ création création séparée séparée puis puis affectation. affectation. 1-263 JAVA Christine BONNET Types Types de de bordure bordure Border Border blackline, blackline, etched, etched, raisedbevel, raisedbevel, loweredbevel,empty; loweredbevel,empty; blackline blackline == BorderFactory.createLineBorder(Color.black); BorderFactory.createLineBorder(Color.black); etched etched == BorderFactory.createEtchedBorder(); BorderFactory.createEtchedBorder(); raisedbevel raisedbevel == BorderFactory.createRaisedBevelBorder(); BorderFactory.createRaisedBevelBorder(); loweredbevel loweredbevel == BorderFactory.createLoweredBevelBorder(); BorderFactory.createLoweredBevelBorder(); empty empty == BorderFactory.createEmptyBorder(); BorderFactory.createEmptyBorder(); //// jComp1, jComp1, 2, 2, 3, 3, 44 :: JPanel JPanel jComp1.setBorder(blackline); jComp1.setBorder(blackline); jComp2.setBorder(raisedbevel); jComp2.setBorder(raisedbevel); jComp3.setBorder(loweredbevel); jComp3.setBorder(loweredbevel); jComp4.setBorder(empty); jComp4.setBorder(empty); 1-264 JAVA Christine BONNET createEmptyBorder createEmptyBorder Création d'une bordure invisible – sans argument : Border createEmptyBorder() Æ utile pour créer une bordure titrée sans borne visible. – avec arguments : nombres de pixels que la bordure occupe en haut, à gauche, en bas, à droite (dans cet ordre) Border createEmptyBorder(int, int, int, int) Æ utile pour mettre des espaces autour d'un composant. 1-265 JAVA Christine BONNET Bordures Bordures titrées titrées // // Bordures Bordures titres titres TitledBorder TitledBorder title; title; title title == BorderFactory.createTitledBorder("title"); BorderFactory.createTitledBorder("title"); jComp5.setBorder(title); jComp5.setBorder(title); title title == BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( blackline, blackline, "title"); "title"); title.setTitleJustification(TitledBorder.CENTER); title.setTitleJustification(TitledBorder.CENTER); jComp6.setBorder(title); jComp6.setBorder(title); title title == BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( loweredetched, loweredetched, "title"); "title"); title.setTitleJustification(TitledBorder.RIGHT); title.setTitleJustification(TitledBorder.RIGHT); jComp7.setBorder(title); jComp7.setBorder(title); title title == BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( loweredbevel, loweredbevel, "title"); "title"); title.setTitlePosition(TitledBorder.ABOVE_TOP); title.setTitlePosition(TitledBorder.ABOVE_TOP); jComp8.setBorder(title); jComp8.setBorder(title); title title == BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( empty, empty, "title"); "title"); title.setTitlePosition(TitledBorder.BOTTOM); title.setTitlePosition(TitledBorder.BOTTOM); jComp9.setBorder(title); jComp9.setBorder(title); 1-266 JAVA Christine BONNET TitledBorder TitledBorder TitledBorder String, int, createTitledBorder(Border, int) Paramètres : – Bordure, – Titre de la bordure, – Position du titre : ABOVE_TOP, TOP (par défaut), BELOW_TOP, ABOVE_BOTTOM, BOTTOM, et BELOW_BOTTOM et – Justification : LEADING (par défaut), CENTER, ou TRAILING 1-267 JAVA Christine BONNET PERSONNALISATION PERSONNALISATION DE DE L’APPARENCE L’APPARENCE DES DES COMPOSANTS COMPOSANTS (suite) (suite) Positionnement Positionnement absolu absolu Pas Pas d’utilisation d’utilisation de de gestionnaire gestionnaire de de présentation présentation conteneur.setLayout(null); // pas de gestionnaire de présentation JButton b1 = new JButton("un"); JButton b2 = new JButton("deux"); conteneur.add(b1); conteneur.add(b2); Dimension size = b1.getPreferredSize(); // renvoie la taille choisie pour le composant b1.setBounds(25, 5, size.width, size.height); // setBounds : coord. x, y, largeur, hauteur size = b2.getPreferredSize(); b2.setBounds(55, 40, size.width, size.height); ...//In the main method: frame.setSize(300, 125); // setSize : largeur, hauteur 1-268 JAVA Christine BONNET PERSONNALISATION PERSONNALISATION DE DE L’APPARENCE L’APPARENCE DES DES COMPOSANTS COMPOSANTS (suite) (suite) Utilisation Utilisation de de gestionnaires gestionnaires de de présentation présentation Imbriquer Imbriquer des des panneaux panneaux et et des des gestionnaires gestionnaires de de présentation présentation est est une une pratique pratique courante courante permettant permettant d'avoir d'avoir un un contrôle contrôle très très précis précis sur sur la la présentation présentation de de l'application l'application .. •• Affichage Affichage d'un d'un composant composant dans dans un un espace espace aussi aussi grand grand que que celui-ci celui-ci peut peut occuper occuper :: Æ Æ GridLayout GridLayout (seul (seul composant composant du du conteneur) conteneur) ou ou GridBagLayout GridBagLayout (sinon) (sinon) ,, BorderLayout BorderLayout •• Affichage Affichage de de composants composants en en lignes lignes :: Æ Æ Utilisation Utilisation d'un d'un JPanel JPanel pour pour grouper grouper les les composants composants et et FlowLayout, FlowLayout, BoxLayout BoxLayout (ou (ou SpringLayout) SpringLayout) 1-269 JAVA Christine BONNET • Affichage de composants de même taille, en lignes et en colonnes Æ GridLayout • Affichage de composants dans une ligne ou une colonne, avec éventuellement des espaces variables entre eux, des alignements ou des tailles spécifiques de composants : Æ BoxLayout • Affichage de colonnes alignées (par exemple, une colonne de labels utilisée pour décrire des champs texte d'une colonne adjacente) Æ SpringLayout • Affichage d'une présentation complexe avec plusieurs composants : Æ GridBagLayout ou SpringLayout, ou grouper les composants dans un ou plusieurs JPanels (avec des gestionnaires de présentation différents). 1-270 JAVA Christine BONNET