Cours5- Les Frames
Transcription
Cours5- Les Frames
Cours 6 : Interface graphique en Java - Les Frames Préambule : Ce cours ne contient que quelques brèves descriptions des composants graphiques Java. La liste présentée est loin d’être exhaustive. Pour de plus amples renseignements concernant le sujet, un lien intéressant qui peut vous être utile: http://java.sun.com/docs/books/tutorial/uiswing/components/ Vous y trouverez de nombreux exemples. Bonne lecture !! Tous les tests contenus dans ce dossier nécessitent le compilateur Java 1.5. 1. Les Packages AWT et SWING : AWT (Abstract Window ToolKit) est un ensemble de classes Java qui permettent de faire des interfaces graphiques, c'est-à-dire simuler des boutons, des menus, des icônes, … tous les widgets systèmes. Ces classes sont déclarées dans le package java.awt. Pour être portable (même au niveau de l’apparence), les classes SWING sont crées et sont déclarées dans le package javax.swing. c- containers spécifiques JInternalFrame : permettre d’afficher une fenêtre dans une JFrame JLayeredPane : permet d’afficher des JPanels à différents niveaux. JRootPane : structure de base des composants swing pouvant contenir des menus. 2.2. Les composants sont répartis en 2 groupes : a- composants non éditable : (pas d’évènement) JProgessBar : affiche une barre de progession JLabel : permet d’afficher un texte dans une zone d’étiquette. On peut y mettre un texte en format HTML JToolTip : affiche des indications sur un composant b- composants éditables (génèrent un évènement) JTextField : représente un champ de saisie d’un texte. JTextArea : permet de travailler avec un texte sur plusieurs lignes JButton : représente un bouton qui génère un événement sur un simple click JComboxBox : permet de choisir qu’un seul élément dans une liste JList : permet de choisir plusieurs éléments dans une liste JPasswordField : permet de saisir un texte « crypté » Les swing sont représentés par un ensemble de containers et des composants de base. Seules les frames sont présentées dans ce document. container niveau 1 2. Hiérarchie des containers et les composants de base : Remarque : Seules les classes ci-dessous marquées en « gras » sont présentées avec un exemple. La liste des classes n’est pas exhaustive. Une frame est une fenêtre qui contient (encapsule) des containers qui contiennent eux-mêmes des composants. containers génériques 2.1. Les containers sont répartis en 3 catégories : a- containers de haut niveau JApplet : définit une applet JDialog : définit une fenêtre de dialogue qui peut être modale ou non JFrame : définit une fenêtre de type application contenant des titres, des boutons, des menus, … JWindows : définit une fenêtre sans le cadre b- containers génériques : JPanel : c’est une classe destinée à contenir d’autres classes. On fait en principe appel à la méthode setLayout(LayoutManager) pour gérer la manière dont les composants sont placés. JScrollPane : permettre d’ajouter un ascenseur à un textArea. JTabbedPane : permettre de mettre plusieurs panels dans des onglets. JToolbar : permettre de créer une barre de boutons (JButton) JMenuBar : permettre de créer une barre de menus et de sous-menus (items) Java 6: Les Frames 1 Hua T-Tê Containers spécifiques composants composants 3. Les évènements : Pour pouvoir gérer les évènements (capture d’un évènement), il faut implémenter l’interface correspondant à l’évènement : - ActionListener - ChangeListener - WindowsListener Java 6: Les Frames Ces interfaces sont déclarées dans le package java.awt.event. 2 Hua T-Tê Soient jlabel un JLabel et jTextField un JTextfield : alors pour les ajouter dans le container niveau 2 de nom panel1 (ci-dessus), on écrit panel1.add(jlabel) ; panel1.add(jTextField) Par exemple pour être prévenu d’un évènement survenu à un des composants éditables, il faut implémenter l’interface ActionListener à la classe qui récupère l’évènement pour le traiter : puis ajouter le container de niveau 2 (panel1) au container de niveau 1 (contain): contain.add(jpanel) class RecupEvenement implements java.awt.event.ActionListener { public void actionPerformed(java.awt.even.ActionEvent event) { ….. traiter l’évènement ici… } } on dimensionne la frame par la méthode setSize() ou par pack() this.setSize(50,100) dimensionne la frame sur 50 de longueur et 100 de largeur ou bien tout simplement, this.pack() pour redimensionner automatiquement la frame. Pour enregistrer un évènement, il faut associer au composant “éditable” du container de la frame, une commande pour écouter les évènements (méthode addActionListener()). si on veut, on peut centrer la frame au milieu de l’écran: this.setLocationRelativeTo(null) 4. Construction d’une frame : Pour créer une frame, il suffit de créer une sous-classe de la classe JFrame comme par exemple : public class Exemp1Frame extends JFrame … { … ici construction de la frame … } enfin, on rend la frame visible : this.show() ; ou bien this.setVisible(true) ; 5 Le constructeur de cette frame va dessiner la fenêtre graphique qui va être affichée. Pour cela, il faudra définir dans l’ordre les éléments (classe) suivants : 1 container niveau 1: Container contain = getContentPane() ; contain.setLayout(new GridLayout(2,3,10,10)) ; getContentPane() crée le container setLayout définit la forme du container : par exemple, le container « contain » contient 2 containers de niveau 2 (un JPanel par exemple) de 3 lignes chacun. La dimension de chaque container niveau 2 est de 10*10 pixels dans le cas des composants éditables qui peuvent générer un évènement, alors il faut écouter l’évènement en l’interceptant par la méthode addActionListener() sur le composant comme par exemple jTextField.addActionListener() intercepte l’évènement crée par jTextField (en général après la saisie d’un texte) La classe Container est définie dans le package java.awt 2 Container de niveau 2: ils dérivent du container de niveau 1 comme par exemple JPanel : JPanel panel1= new JPanel() ; Crée 1 panel qui sera ajouté au container de niveau 1 « contain » après qu’on l’ait rempli de composants. contain.add(panel1) ajoute le panel dans le container une fois que le panel soit rempli de composants 3 les composants (éditables et non éditables) de bas niveau : JLabel, JTextField, JTextfield, JButton, JComboBox, .... On crée ces composants avec leur constructeur respectif ou les transformer et leur donner une apparence spécifique avec leur méthode respective. 4 puis on les ajoute au container de niveau 2 (JPanel dans l’exemple) par la méthode add(). Java 6: Les Frames 3 Hua T-Tê Java 6: Les Frames 4 Hua T-Tê 5.2. Exemple1 bis : une frame éditable utilisant le JTextArea Ce composant est souvent utilisé pour afficher des listes ou des tables de données : 5. Quelques exemples de frames: 5.1. Exemple1 : Un exemple d’affichage d’un libellé JLabel dans une frame sans évènement. Soit la classe Exemp1Frame.java : import java.awt.*; import javax.swing.*; public class Exemp1BisFrame extends JFrame{ import javax.swing.*; import java.awt.*; public static void main(String [] s) public class Exemp1Frame extends JFrame{ public static void main(String [] s) {new Exemp1Frame();} public Exemp1Frame() { Container container= getContentPane() ; container.setLayout(new GridLayout(1,1,10,10)) ; // frame à 1 panel contenant 1 ligne de largeur10 et hauteur 10 pixels JPanel panel1= new JPanel() ; // création du Panel, container de niveau 2 JLabel login=new JLabel("Bonjour!!Bienvenue..");// création du composant panel1.add(login) ; // ajout du composant au Container niveau 2 container.add(panel1) ;// ajout du panel au container niveau 1 {new Exemp1BisFrame();} public Exemp1BisFrame() {JPanel panel= new JPanel(); Container container= getContentPane() ; container.setLayout(new GridLayout(1,1,10,10)) ; // création d’une frame à 1 panel contenant 1 ligne JTextArea text = new JTextArea(60,50); // HAUTEUR * LARGEUR ==> le dixieme des dimensions de la frame text.setText(" hello \n Je suis dans un textArea!!\n Vous pouvez m'afficher sur autant de lignes" + " que vous voulez!! \n "); this.setSize(50,100); //LARGEUR * HAUTEUR de la frame // ou this.pack() ; redimensionne automatiquement la frame par défaut this.show(); // ou setVisible(true); panel.add(text) ; // ajout du composant au Container niveau 2 container.add(panel) ; //ajout du panel au container niveau 1 } this.setTitle("Un EXemple de TextArea"); // Ajouter un titre à la frame setSize(300,300); //LARGEUR * HAUTEUR de la frame show(); // ou setVisible(true); } Voilà le résultat affiché par la frame : } } JLabel JPanel Remarque : La classe ci-dessous est lancée comme une application Java (méthode main()). On peut la lancer comme une frame (ou une applet) Java, dans ce cas, il faut remplacer la méthode main() par la méthode « start() » ou « init() » : public void start() {new Exemp1Frame();} ou public void init()) {new Exemp1Frame();} 5 Java 6: Les Frames Hua T-Tê 6 Java 6: Les Frames 5.3. Exemple 2 : Une frame avec un évènement Pour écouter l’évènement, il faudrait créer une classe Evenement qui implémente l’interface ActionListener et qui contient la méthode actionPerformed comme ci-dessous : Hua T-Tê container.setLayout(new GridLayout(1,2,10,10)) ; // création d’une frame à 1 panel contenant 2 lignes // creation du 1er composant JPanel panel1= new JPanel() ; JLabel login=new JLabel("login") ; panel1.add(login) ; // creation du 2eme compsosant saisielogin = new JTextField("",15); // créer une zone de controle de largeur 15 avec un texte vide panel1.add(saisielogin); import java.awt.event.*; public class ExempleEvenement implements ActionListener{ public void actionPerformed(ActionEvent event) { if (event.getSource()== Exemp2Frame.saisielogin) { String mes= Exemp2Frame.saisielogin.getText(); System.out.println(" Vous avez saisi: " + mes); } else System.out.println(" aucun evenement "); } //pour ecouter l'evenement, on a ajouter ceci ExempleEvenement event= new ExempleEvenement(); saisielogin.addActionListener(event); //enfin on ajoute le panel dans le container container.add(panel1) ; } Où - setSize(350,100); show(); getSource() sur une ActionEvent permet de récupérer l’évènement Exemp2Frame.saisielogin est un objet de JTextField de la classe Exemp2Frame ci-dessous. la fonction getText() sur un JTextField permet de récupérer le texte saisi //LARGEUR * HAUTEUR de la frame // ou setVisible(true); } } On va ajouter à la frame ci-dessus une zone de contrôle pour saisir un texte comme le montre la frame suivante : 5.4. Exemple 3 : Affichage d’une frame représentant une fenêtre de connexion contenant : un libellé (login), une zone texte (pour la saisie du login), un autre label (password) et une zone de texte pour saisir le mot de passe. JTextField JPanel Ajouter un titre à la fenêtre JLabel 1 JPanel La classe Exemp2Frame qui permet d’afficher la frame : Un autre JPanel import javax.swing.*; import java.awt.*; La classe Exemp3Frame ci-dessous permet de créer cette frame : public class Exemp2Frame extends JFrame{ public static JTextField saisielogin; // saisielogin doit être en static comme le sont // tous les composants éditables de cette frame public static void main(String [] s) {new Exemp2Frame();} public Exemp2Frame() { Container container= getContentPane() ; // créer le container pour y mettre les composants Java 6: Les Frames 7 Hua T-Tê JPasswordField import javax.swing.*; import java.awt.*; public class Exemp3Frame extends JFrame{ public static JTextField saisielogin; public static JPasswordField jpwd; // on a ajouté le champ password Java 6: Les Frames 8 Hua T-Tê public static void main(String [] s) {new Exemp3Frame();} public Exemp3Frame() { Container container= getContentPane() ; container.setLayout(new GridLayout(2,2,5,10)) ; // creation de la 1ere partie de la frame JPanel panel1= new JPanel() ; JLabel login=new JLabel("login ") ; panel1.add(login) ; saisielogin = new JTextField("",15); panel1.add(saisielogin); ExempleEvenement event1= new ExempleEvenement(); saisielogin.addActionListener(event1); container.add(panel1) ; // creation de la 2ere partie de la frame JPanel panel2= new JPanel() ; JLabel pwd=new JLabel("password") ; panel2.add(pwd) ; jpwd = new JPasswordField("",15); panel2.add(jpwd); ExempleEvenement event2= new ExempleEvenement(); jpwd.addActionListener(event2); container.add(panel2) ; // pour ajouter un titre à la frame this.setTitle(" FENETRE AUTHENTIFICATION"); setSize(350,130); //LARGEUR * HAUTEUR de la frame show(); } } Et la classe qui récupère l’évènement sera enrichie de la capture du champ de type password : import java.awt.event.*; public class ExempleEvenement implements ActionListener{ public void actionPerformed(ActionEvent event) {if (event.getSource()== Exemp3Frame.saisielogin) { String mes= Exemp3Frame.saisielogin.getText(); System.out.println(" Vous avez saisi: " + mes); } else if (event.getSource()== Exemp3Frame.jpwd) { String mes= Exemp3Frame.jpwd.getText(); System.out.println(" Vous avez saisi: " + mes); Exemp3Frame.jpwd.setText(""); // remettre à blanc la zone } else System.out.println(" aucun evenement "); } } Remarque : On peut aussi ne créer qu’une seule classe JFrame qui écoute en même temps les évènements puis les traite. Pour cela il suffit qu’elle implémente l’interface ActionListener et qu’elle implémente la méthode actionPerformed() comme le montre l’exemple ci-dessous à partir de l’exemple 2 ci-dessus : import javax.swing.*; import java.awt.event.*; import java.awt.*; // c'est l'exemple2Frame inclus le traitement des evenements public class Exemple2bisFrame extends JFrame implements ActionListener{ private JTextField saisielogin; public static void main(String [] s) // plus besoin d'etre en static {new Exemple2bisFrame();} public Exemple2bisFrame() { Container container= getContentPane() ; container.setLayout(new GridLayout(1,2,10,10)) ; // création d’une frame à 1 panel contenant 2 lignes // creation du 1er composant JPanel panel1= new JPanel() ; JLabel login=new JLabel("login") ; panel1.add(login) ; // creation du deuxieme compsosant saisielogin = new JTextField("",15); panel1.add(saisielogin); //**** pour ecouter l'evenement, on recupere l'evenement //*** de la cette meme frame ... saisielogin.addActionListener(this); container.add(panel1) ; setSize(350,100); show(); //LARGEUR * HAUTEUR de la frame } public void actionPerformed(ActionEvent event) { if (event.getSource()== saisielogin) { String mes= saisielogin.getText(); System.out.println(" Vous avez saisi: " + mes); } else System.out.println(" aucun evenement "); } } La méthode setText(String) sur un composant permet de forcer ce composant au String passé. C’est l’inverse de la méthode getText(). Java 6: Les Frames 9 Hua T-Tê Java 6: Les Frames 5.5. Exemple 4: On peut créer une frame pour lancer plusieurs autres frames en clickant sur des boutons comme le montre l’exemple suivant qui lance la frame Exemp2Frame ou Exemp3Frame selon que l’on clicke l’un ou l’autre bouton. La bouton stop ferme la frame. L’exemple Exemp4Frame ci-dessous est une frame implémentant l’interface ActionListener. 10 Hua T-Tê } public void actionPerformed(ActionEvent evt){ if (evt.getSource() == b1) { new Exemp2Frame();} if (evt.getSource() == b2) { new Exemp3Frame();} if (evt.getSource() == b3) {this.hide();} // hide() ferme la frame } public static void main(String [] s) { new Exemple4Frame(); } } 5.6. Exemple 5 : un exemple de frame utilisant les composants: JComboBox JCheckBox JRadioButton import javax.swing.*; import java.awt.event.*; import java.awt.*; Le tableau du JComboBox public class Exemple4Frame extends JFrame implements ActionListener { JButton b1, b2, b3; public Exemple4Frame () { Container container=getContentPane(); container.setLayout(new GridLayout(3,1,10,10)); 2 JRadioButton 1 JCheckBox b1= new JButton("LANCEMENT FRAME EXEMPLE 2"); b2= new JButton("LANCEMENT FRAME AUTHENTIFICATION"); b3= new JButton("FIN"); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); 1 JButton container.add(b1);container.add(b2);container.add(b3); this.setTitle("MENU PRINCIPAL"); setSize(250,250); setVisible(true); Java 6: Les Frames 11 Hua T-Tê Java 6: Les Frames 12 Hua T-Tê panel1.add(menuprincipal) ; panel1.add(BoxChoix); container.add(panel1); // Ajout d'un Button de retour panel1 = new JPanel(); retour= new JButton("RETOUR"); retour.addActionListener(this); panel1.add(retour); this.getContentPane().add(panel1); import javax.swing.*; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.*; public class Exemp5Frame extends JFrame implements ActionListener{ private JComboBox comboBox; private JRadioButton RadioChoix1, RadioChoix2; private JCheckBox BoxChoix; private JButton retour; // au lieu container.add(Zone4) this.setTitle(" UN EX DE ComboX + BoutonRadio + CheckBox"); setSize(380,330); show(); } public void actionPerformed(ActionEvent event) { if (event.getSource() == comboBox) // cas ComboBox { int nbre= comboBox.getItemCount(); // retourne le nombre total de choix dans la liste int choix = comboBox.getSelectedIndex(); //retourne l'index correspondant au choix dans le Vector String typechoix= ""; switch (choix) { case 0 : typechoix="creation";break; case 1 : typechoix="suppression";break; case 2 : typechoix="miseAjour";break; case 3 : typechoix="Afficher";break; } JOptionPane.showMessageDialog (null, "CHOIX est " + typechoix + " \nNb total de choix= " + nbre); } public static void main(String [] s) {new Exemp5Frame();} public Exemp5Frame() { Container container= getContentPane() ; container.setLayout(new GridLayout(4,4,5,10)) ; // création d’une frame à 4 panel contenant 4 lignes // creation de la 1ere partie de la frame contenant 1 label+ 1 comboBox JPanel panel1= new JPanel() ; JLabel menuprincipal=new JLabel("Faites votre choix ") ; panel1.add(menuprincipal) ; // Ajout d'un ComboBox avec les choix dans le tableau de String tabAction String[] tabAction = {"création","suppression","miseAjour","afficher"}; comboBox = new JComboBox(tabAction); comboBox.addActionListener(this); panel1.add(comboBox); container.add(panel1); else // cas bouton radio 1 if (event.getSource() == RadioChoix1) { JOptionPane.showMessageDialog(null, "Vous etes un visiteur"); RadioChoix1.setVisible(false); // cache le bouton 1 RadioChoix2.setEnabled(false);} // rend le bouton2 non dispo else // cas bouton radio 2 if (event.getSource() == RadioChoix2) {JOptionPane.showMessageDialog(null, "Vous etes un Administateur else // cas checkbox if (event.getSource() == BoxChoix) new Exemple4Frame(); else // cas bouton enfonce if (event.getSource() == retour) { this.hide(); JOptionPane.showMessageDialog(null, "Au Revoir!!"); } // Ajout d'un bouton Radio RadioChoix1 = new JRadioButton("Visiteur"); RadioChoix2 = new JRadioButton("Administrateur"); RadioChoix1.addActionListener(this); RadioChoix2.addActionListener(this); // ici on réutilise le meme panel apres l'avoir reinitialise panel1 = new JPanel(); panel1.add(RadioChoix1);panel1.add(RadioChoix2); container.add(panel1); // Ajout d'un Check Box BoxChoix = new JCheckBox(); BoxChoix.addActionListener(this); menuprincipal=new JLabel("POUR LANCER LA FRAME EXEMP4 ") ; else System.out.println(" aucun evenement "); } } panel1 = new JPanel(); Java 6: Les Frames 13 Hua T-Tê 14 Java 6: Les Frames Hua T-Tê 5.7. Exemple 6 : un exemple de frame utilisant les menus. Pour présenter une frame avec des menus de choix sous forme d’onglets, il faut utiliser les classes suivantes : Container (niveau 1) JMenuBar (niveau 2) JMenu, JMenuItem (composants) Le sous-menu « Affichage » est un JMenu. Il contient 2 sousmenus JMenuItem Affichage Formulaire et Affichage Feuille de donnees Seuls les JMenuItem peuvent envoyer des messages. Le choix se fait à travers les JMenuItems. On ajoute des JMenu et JMenuItem dans les JMenuBar qu’on ajoute dans les Container. On peut aussi ajouter des JMenu dans des JMenu. Pour connaître quel JMenuItem a été choisi, on récupère l’évènement par la méthode getActionCommand() sur l’évènement: c’est la chaîne de caractères nommant le JMenuItem. Cette barre est un JMenuBar contenant 2 JMenus ARTICLE et COMMANDE et 1 JMenuItem FIN Le sous-menu « Affichage Formulaire » est un JMenuItem il peut engendrer un évènement. La chaîne de caractères le nommant est « Affichage Formulaire » la chaîne de caractères nommant ce JMenuItem est « Cde-Creation » import javax.swing.*; JMenuItem « FIN » évènement possible. La chaîne de caractères le nommant est « FIN » JMenu « COMMANDE » pas d’ évènement possible import java.awt.Container; import java.awt.GridLayout; import java.awt.event.*; import java.awt.*; // exemple d'utilisation des menus et des sous-menus public class Exemp6Frame extends JFrame implements ActionListener{ // cette classe est a lancer comme applet Java. Elle remplace la fonction main() public void start() { new Exemp6Frame();} JMenu « ARTICLE » contient 3 sous-menu JMenuItem : la chaîne de caractères nommant le 2eme ss-menu JMenuItem est « Création » public Exemp6Frame() { Container container= getContentPane(); container.setLayout(new GridLayout(2,1,20,10)); JPanel panel1; JMenuBar barMenu; JMenu menu1,menu2; JMenuItem menuItem; La classe Exemp6Frame ci-dessous affiche la frame ci-dessous dans laquelle dans le JMenuBar : on y met 2 JMenu ARTICLE et COMMANDE et 1 JMenuItem FIN. Seul le JMenuItem peut engendrer un évènement : un click sur FIN ferme la frame par exemple dans le JMenuItem ARTICLE, il y a 3 sous-menus représentés par 3 JMenuItem. Chaque JMenuItem engendre un évènement représenté par la chaîne de caractères mentionnée sur le sous –menu (Consultation,Création,…) dans le JMenuItem COMMANDE, il y a 2 sous-menus dont le 1er sous-menu contient lui-même 2 autres sous-menus : Java 6: Les Frames 15 Hua T-Tê this.setTitle("EXEMPLE DE MENUS ET SOUS-MENUS"); // Ici on a voulu mettre un texte en format Html Java 6: Les Frames 16 Hua T-Tê JLabel label= new JLabel("<html> <center> <br><br><br><br> <hR><h3> EXEMPLE D'UTILISATION <br> DES MENUS et SOUSMENUS <hr></h3> </html>"); panel1 = new JPanel(); panel1.add(label); menuItem.addActionListener(this); barMenu.add(menuItem); // ajoute le menu bar au container + le cale à gauche de la frame this.setJMenuBar(barMenu); // On cree un menu bar pour y mettre des menus barMenu= new JMenuBar(); container.add(panel1) ; setSize(450,420); show(); // preparation de chaque menu: preparation du menu 1 menu1 = new JMenu("<html><h4>ARTICLE </h4></html>"); // Y ajouter 3 sous menus menuItem= new JMenuItem("Consultation"); menuItem.addActionListener(this); menu1.add(menuItem); menu1.add(new JSeparator()); // ajouter un separateur } public void actionPerformed(ActionEvent event) { // ici on utilise le getActionCommand au lieu du getSource if (event.getActionCommand().equals("Consultation")) JOptionPane.showMessageDialog(null, "Consultation Article déclenché "); else if (event.getActionCommand().equals("Création")) JOptionPane.showMessageDialog(null, "Création Article déclenché "); else if (event.getActionCommand().equals("Affichage Formulaire")) JOptionPane.showMessageDialog(null, "Affichage Formulaire Cde déclenché "); else if (event.getActionCommand().equals("Affichage Feuille de donnees")) JOptionPane.showMessageDialog (null, "Affichage Feuille de donnees Commande déclenché "); else if (event.getActionCommand().equals("Cde-Creation")) JOptionPane.showMessageDialog(null, "Creation Commande déclenché "); else if (event.getActionCommand().equals("<html><h2>FIN</h2></html>")) {JOptionPane.showMessageDialog(null, ".. AU REVOIR ... "); this.hide();} else JOptionPane.showMessageDialog (null, " NON DISPONIBLE .. en cours de Construction "); menuItem= new JMenuItem("Création"); menuItem.addActionListener(this); menu1.add(menuItem); menu1.add(new JSeparator()); // ajouter un separateur menuItem= new JMenuItem("......"); menuItem.addActionListener(this); menu1.add(menuItem); barMenu.add(menu1); menu2 = new JMenu("<html><h4> COMMANDE </h4></html>"); // menu Affichage avec 2 sous-menus menu1= new JMenu("Affichage"); menu2.add(menu1); // ajout de 2 sous-menu avec action menuItem = new JMenuItem("Affichage Formulaire"); menu1.add(menuItem); menuItem.addActionListener(this); menuItem = new JMenuItem("Affichage Feuille de donnees"); menu1.add(menuItem); menuItem.addActionListener(this); menu2.add(new JSeparator()); //LARGEUR * LONGUEUR de la frame } // ajouter un separateur } menuItem= new JMenuItem("Cde-Creation"); menu2.add(menuItem); menuItem.addActionListener(this); barMenu.add(menu2); menuItem = new JMenuItem("<html><h2>FIN</h2></html>"); Java 6: Les Frames 17 Hua T-Tê Java 6: Les Frames 18 Hua T-Tê