Introduction Contenant Composants Mise en page Exemple Introduction Contenant Composants Mise en page Exemple 1 Introduction Présentation Organisation Programmation - Swing - 2 Contenant JFrame JMenu Nicolas Malandain 3 Composants 4 Mise en page Fonctionnement AvecLayoutManager Sans LayoutManager 5 Exemple May 4, 2010 as as Architecture des Systèmes d’Information Swing Introduction Contenant Composants Mise en page Exemple Architecture des Systèmes d’Information 1 / 27 Présentation Organisation Swing Introduction Contenant Composants Mise en page Exemple Swing 2 / 27 Présentation Organisation Deux niveaux d’interface 1 / 3 Présentation Outil de fenêtrage fournit par Java à partir des versions 1.1. en packages séparés de la JVM. Composants Ceux sont les briques élémentaires d’une interface, c’est principalement avec eux que l’utilisateur “dialogue”. depuis la version 1.2 dans les JFC puis dans Java principal avantage : portable quelque soit le window manager ou l’OS Exemples de composants Bouton (JButton) Différences entre SWING et AWT : Swing utilise l’AWT (tous les objets héritent de Container), Étiquette (JLabel) Gestion du Look&Feel dans Swing, Liste (JList) Pas de code natif dans les composants Swing, Champs de saisie (JTextField) Possibilités de mettre des images dans des boutons, des étiquettes,. . . ... Il ne faut pas mélanger les éléments AWT et SWING. Swing 3 / 27 Swing 4 / 27 Introduction Contenant Composants Mise en page Exemple Présentation Organisation Introduction Contenant Composants Mise en page Exemple Deux niveaux d’interface 2 / 3 Deux niveaux d’interface 3 / 3 Contenants Ils servent à organiser les composants. Un composant ne peut être utilisé que dans un contenant. Exemples de contenants (containers) JWindow (fenêtre sans titre ni encadrement) JFrame (fenêtre classique) JDialog (boite de dialogue possibilité de la rendre modale) JApplet (panneau intégré dans un navigateur) les contenants intermédiaires sont aussi des composants. Packages nécessaires contenants intermédiaires (intermediate containers) javax.swing java.awt java.awt.event JPanel (simple panneau) JScrollPane (panneau avec barres de défilement) JTabbedPane (panneau avec onglets) ... Swing 5 / 27 JFrame JMenu Swing Introduction Contenant Composants Mise en page Exemple Présentation : JFrame 1 / 2 6 / 27 JFrame JMenu Présentation : JFrame 2 / 2 Constructeurs et méthodes utiles JFrame() construit une fenêtre invisible sans titre, Description de la JFrame Frame JFrame(String) construit une fenêtre invisible avec titre, Menu Bar Élément principaux : ContentPane, JMenuBar Glass Pane Container getContentPane() void setContentPane( Container ) JMenuBar getJMenuBar() pack() demande a la fenêtre et a ses composants de s’ajuster, setVisible(boolean) affiche ou cache la fenêtre ... Ajout de composants dans la JFrame On n’ajoute pas à la JFrame mais au ContentPane void setJMenuBar( JMenuBar ) Root Pane Organisation La disposition des composants est gérée par des LayoutManager Remarques : toute interface graphique a obligatoirement un contenant de haut-niveau, contenants de haut-niveau (top-level containers) Introduction Contenant Composants Mise en page Exemple Présentation Organisation Content Pane Layered Pane Toute interface graphique a obligatoirement un contenant de haut-niveau soit on utilise le ContentPane donné, Ctrl-Shift-F1 : affichage hiérarchie et propriétés des objets graphiques Swing Le ContentPane fourni est un Container géré par un BorderLayout soit un nouveau ContentPane est créé. 7 / 27 Swing 8 / 27 Introduction Contenant Composants Mise en page Exemple JFrame JMenu Introduction Contenant Composants Mise en page Exemple JFrame JMenu Exemple : JFrame Quelques méthodes de plus setTitle(String), getTitle() setDefaultCloseOperation(int) Exemple10 import java.awt.*; import javax.swing.*; public class Exemple10 { DO NOTHING ON CLOSE HIDE ON CLOSE (par défaut) DISPOSE ON CLOSE EXIT ON CLOSE public static void main(String args[]) { // 1er cas, on utilise le ContentPane JFrame frame1 = new JFrame("Ceci est une fen^ etre"); Container contentpane1 = frame1.getContentPane(); contentpane1.add(new JButton("Ceci est un bouton dans cette fen^ etre"), BorderLayout.CENTER); frame1.pack(); frame1.setVisible(true); } } // 2eme cas, on crée un autre ContentPane JFrame frame2 = new JFrame("Ceci est toujours une fen^ etre"); setResizable(boolean), isResizable() JPanel contentpane2 = new JPanel(); contentpane2.setBorder(BorderFactory.createTitledBorder("Ceci est un bord")); contentpane2.add(new JButton("Ceci est un bouton dans cette fen^ etre")); frame2.setContentPane(contentpane2); setIconImage(Image), Image getIconImage() frame2.pack(); frame2.setVisible(true); Remarque Un contenant intermédiaire n’a pas de ContentPane, on l’utilise directement. Swing Introduction Contenant Composants Mise en page Exemple 9 / 27 JFrame JMenu Swing Introduction Contenant Composants Mise en page Exemple Hiérarchie des classes 10 / 27 JFrame JMenu Construction/Manipulation 1 / 2 Construction d’une barre de menu JMenuBar() Construction de la barre de menu et ajout à la fenêtre JMenuBar menuBar = new JMenuBar(); JFrame frame = new JFrame("essai de menu"); frame.setJMenuBar(menuBar); Construction d’un menu JMenu(), JMenu(String nom), JMenu(String nom, boolean volant) Remarque Un menu JMenu est aussi un JMenuItem Construction d’un menu et ajout à la barre JMenu menu = new JMenu("Mon menu"); menuBar.add(menu); Swing 11 / 27 Swing 12 / 27 Introduction Contenant Composants Mise en page Exemple JFrame JMenu Introduction Contenant Composants Mise en page Exemple Construction/Manipulation 2 / 2 JFrame JMenu Exemple de menu 1 / 3 Construction d’un élément de menu JMenuItem(), JMenuItem(Icon icon), JMenuItem(String text), JMenuItem(String text, int mnemonic) Construction d’un élément et ajout au menu JMenuItem menuItem = new JMenuItem("Element",KeyEvent.VK_E); menu.add(menuItem); Exemple20.java (. . . ) import javax.swing.*; import java.awt.*; import java.awt.event.*; Manipulation il existe aussi des méthodes pour retirer des éléments des menus, public class Exemple20 { public static void main(String[] args) { MaFenetre mf = new MaFenetre("Fen^ etre + Menu"); mf.pack(); mf.setVisible(true); } il est possible d’activer ou de désactiver des menus ou des éléments, ... } Swing Introduction Contenant Composants Mise en page Exemple Swing 13 / 27 JFrame JMenu Introduction Contenant Composants Mise en page Exemple Exemple de menu 2 / 3 14 / 27 JFrame JMenu Exemple de menu 3 / 3 Exemple20.java Exemple20.java (. . . ) // 3eme et 4eme elements, Groupe de boutons radio ButtonGroup group = new ButtonGroup(); rbMenuItem1 = new JRadioButtonMenuItem("Bouton radio 1"); rbMenuItem1.setSelected(true); group.add(rbMenuItem1); menu.add(rbMenuItem1); rbMenuItem2 = new JRadioButtonMenuItem("Bouton radio 2"); rbMenuItem2.setSelected(true); group.add(rbMenuItem2); menu.add(rbMenuItem2); class MaFenetre extends JFrame { public MaFenetre(String titre) { super(titre); ((JComponent)getContentPane()).setPreferredSize(new Dimension(300,200)); JMenuBar menuBar; JMenu menu, sousMenu; JMenuItem menuItem; JCheckBoxMenuItem cbMenuItem; JRadioButtonMenuItem rbMenuItem1, rbMenuItem2; // creation de la barre de menu menuBar = new JMenuBar(); setJMenuBar(menuBar); // creation du 1er menu et de ses elements menu = new JMenu("Menu 1"); menu.setMnemonic(KeyEvent.VK_1); menuBar.add(menu); // 1er element menuItem = new JMenuItem("Simple Item",KeyEvent.VK_S); menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); menu.add(menuItem); // un separateur menu.addSeparator(); // 5eme element, une case a cocher cbMenuItem = new JCheckBoxMenuItem("Case a cocher"); cbMenuItem.setMnemonic(KeyEvent.VK_C); menu.add(cbMenuItem); // 6eme element, un sous menu sousMenu = new JMenu("Sous menu"); menu.add(sousMenu); // elements du sous menu menuItem = new JMenuItem("Element de sous menu"); sousMenu.add(menuItem); // 2eme element menuItem = new JMenuItem("Item avc image",new ImageIcon("radio.gif")); menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, ActionEvent.ALT_MASK)); menu.add(menuItem); // creation du 2eme menu menu = new JMenu("Menu 2"); menu.setMnemonic(KeyEvent.VK_2); menuBar.add(menu); // un separateur menu.addSeparator(); } Swing 15 / 27 } Swing 16 / 27 Introduction Contenant Composants Mise en page Exemple Introduction Contenant Composants Mise en page Exemple Comportements de base Quelques composants JComponent JLabel Classe de base des composants Swing JLabel e = new JLabel("étiquette",SwingConstants.LEFT); Quelques méthodes apparence set/getBorder, set/getForeground, set/getBackground, set/getFont, setOpaque, isOpaque JButton JButton b = new JButton("Le bouton"); JTextField JTextField t = new JTextField("texte",10); état setToolTipText, setEnabled, isEnabled, set/getCursor, setVisible, isVisible JCheckBox JCheckbox c = new JCheckbox("checkbox",true); affichage repaint, revalidate, paintComponent mise en page set/getPreferredSize, set/getMinimumSize, set/getMaximumSize, set/getAlignmentX, set/getAlignmentY Swing Introduction Contenant Composants Mise en page Exemple JRadioButton JRadioButton rb1 = new JRadioButton("radio 1"); JRadioButton rb2 = new JRadioButton("radio 2"); ButtonGroup bg = new ButtonGroup(); bg.add(rb1); bg.add(rb2); 17 / 27 Fonctionnement AvecLayoutManager Sans LayoutManager LayoutManager Swing Introduction Contenant Composants Mise en page Exemple 18 / 27 Fonctionnement AvecLayoutManager Sans LayoutManager Fonctionnement de l’ajustement 1 / 2 Objectif du LayoutManager Demande d’information descendante Pour ajuster la taille d’une JFrame à son contenu il va interroger chacun des objets contenus qui vont eux-mêmes interroger les objets qu’ils contiennent... Les dimensions des objets et des marges seront additionnées à la remontée des appels. Demande à chaque composant ses préférences dimensionnelles et les ajuste les uns par rapport aux autres. Sans LayoutManager : positions et dimensions sont fixés Construction d’interface graphique 5 informations pour s’ajuster setPreferredSize(Dimension d) Gestion Liste Nicolas Maurice Jacques Mauro setMinimumSize(Dimension d) panneau Maurice setMaximumSize(Dimemsion d) Ajouter Enlever setAlignmentX(float f), setAlignmentY(float f) panneau Swing 19 / 27 Swing 20 / 27 Introduction Contenant Composants Mise en page Exemple Fonctionnement AvecLayoutManager Sans LayoutManager Introduction Contenant Composants Mise en page Exemple Fonctionnement AvecLayoutManager Sans LayoutManager Quelques LayoutManager Fonctionnement de l’ajustement 2 / 2 Remarques La plupart des composants règlent eux-mêmes leur taille en fonction de ce qu’ils contiennent. Par exemple, une JLabel en fonction du texte qu’elle contient. 5 exemples LayoutManager Ajout des composants leContenant.add(...leComposant ...) GridLayout positionne les composants dans des cellules définies par une grille et utilise le maximum d’espace. FlowLayout positionne les composants les uns derrière les autres. BorderLayout positionne les composants dans 5 endroits (NORTH, SOUTH, EAST, WEST, CENTER) en maximisant l’espace occupé. GridBagLayout idem, mais autorise les composants à utiliser plus d’une cellule, de plus les cellules ne sont pas forcément de la même taille. L’envoi de message est sur le contenant, mais le choix du message dépend du LayoutManager BoxLayout positionne les composants avec la possibilité de les aligner. Rappel Pour les contenants de haut-niveau, les composants sont ajoutés au ContentPane et non au contenant directement. Swing Introduction Contenant Composants Mise en page Exemple Ajustement de l’interface par la méthode pack() 21 / 27 Fonctionnement AvecLayoutManager Sans LayoutManager FlowLayout Swing Introduction Contenant Composants Mise en page Exemple 22 / 27 Fonctionnement AvecLayoutManager Sans LayoutManager BorderLayout Flow.java import javax.swing.*; import java.awt.*; import java.io.*; JTextField t = new JTextField("texte",10); contentPane.add(t); public class Flow { public static void main(String[] params) { JFrame frame = new JFrame("FlowLayout"); Container contentPane = frame.getContentPane(); contentPane.setLayout(new FlowLayout()); BorderL.java JCheckBox c = new JCheckBox("checkbox",true); contentPane.add(c); import javax.swing.*; import java.awt.*; String[] dataCombo = {"titi","tata","toto"}; JComboBox ch = new JComboBox(dataCombo); contentPane.add(ch); public class BorderL { public static void main(String[] params) { JFrame frame = new JFrame("BorderLayout"); Container contentPane = frame.getContentPane(); frame.pack(); // lance l’ordre de réorganisation frame.setVisible(true); JLabel e = new JLabel("étiquette",SwingConstants.LEFT); contentPane.add(e); } JCheckBox c = new JCheckBox("checkbox",true); contentPane.add(BorderLayout.SOUTH,c); JLabel e = new JLabel("étiquette",SwingConstants.LEFT); contentPane.add(BorderLayout.WEST,e); String[] dataList = {"item 1","item 2","item 3","item 4"}; JList l = new JList(dataList); l.setVisibleRowCount(3); JScrollPane scrollList = new JScrollPane(l); contentPane.add(scrollList); Swing JTextField t = new JTextField("texte",10); contentPane.add(BorderLayout.CENTER,t); // un BorderLayout avec marges entre composants contentPane.setLayout(new BorderLayout(10,10)); } JButton b = new JButton("Le bouton"); contentPane.add(b); String[] dataList = {"item 1","item 2","item 3","item 4"}; JList l = new JList(dataList); l.setVisibleRowCount(3); JScrollPane scrollList = new JScrollPane(l); contentPane.add(BorderLayout.NORTH,scrollList); JButton b = new JButton("Le bouton"); contentPane.add(BorderLayout.EAST,b); 23 / 27 frame.pack(); // lance l’ordre de réorganisation frame.setVisible(true); } } Swing 24 / 27 Introduction Contenant Composants Mise en page Exemple Fonctionnement AvecLayoutManager Sans LayoutManager BoxLayout Introduction Contenant Composants Mise en page Exemple Fonctionnement AvecLayoutManager Sans LayoutManager Positionnement absolu PosAbsolue.java import javax.swing.*; import java.awt.*; public class PosAbsolue { public static void main(String[] params) { MaJFrame mf = new MaJFrame("Ma JFrame"); mf.setSize(200,350); // ne pas faire de pack sinon la fenetre se reduit à la taille 0 // mf.pack(); mf.setVisible(true); } } BoxL.java import javax.swing.*; import java.awt.*; import java.io.*; // creation d’une boite vide extensible Dimension minSize = new Dimension(200, 5); Dimension prefSize = new Dimension(200, 50); Dimension maxSize = new Dimension(200, 100); contentPane.add(new Box.Filler(minSize, prefSize, maxSize)); public class BoxL { public static void main(String[] params) { // creation d’une boite vide remplissant l’espace au maximum JFrame frame = new JFrame("BoxLayout"); // contentPane.add(Box.createGlue()); JPanel contentPane = new JPanel(); frame.setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); JButton b3 = new JButton("CC"); b3.setAlignmentX(JComponent.RIGHT_ALIGNEMENT); JButton b1 = new JButton("AAAAAAAA"); contentPane.add(b3); b1.setAlignmentX(JComponent.CENTER_ALIGNEMENT); contentPane.add(b1); JButton b4 = new JButton("D"); b4.setAlignmentX((float)0.2); // creation d’une boite vide de 5 pixel de haut contentPane.add(b4); contentPane.add(Box.createRigidArea(new Dimension(0,5))); JButton b2 = new JButton("BBBB"); b2.setAlignmentX(JComponent.LEFT_ALIGNEMENT); contentPane.add(b2); } } frame.pack(); // lance l’ordre de réorganisation frame.setVisible(true); Swing 25 / 27 Introduction Contenant Composants Mise en page Exemple Exemple Gestion de Liste 1 / 1 Exemple30.java import javax.swing.*; import java.awt.*; import java.awt.event.*; JScrollPane listScrollPane = new JScrollPane(list); add(listScrollPane, BorderLayout.CENTER); // panneau contenant le textfield et les 2 boutons JPanel panneauBouton = new JPanel(); public class Exemple30 { public static void main(String[] args) { JFrame fenetre= new JFrame("Gestion de liste"); PanneauGestionListe panneauGL = new PanneauGestionListe(); fenetre.setContentPane(panneauGL); fenetre.pack(); fenetre.setVisible(true); } } class PanneauGestionListe extends JPanel { private JList list; private DefaultListModel listModel; private JTextField nomPersonne; // création des boutons et du champs de saisie JButton ajout = new JButton("Ajouter"); JButton enlever = new JButton("Enlever"); nomPersonne = new JTextField(10); nomPersonne.setText(list.getSelectedValue().toString()); panneauBouton.add(nomPersonne); panneauBouton.add(ajout); panneauBouton.add(enlever); add(panneauBouton, BorderLayout.SOUTH); } } public PanneauGestionListe() { setLayout(new BorderLayout()); // création de la liste listModel = new DefaultListModel(); listModel.addElement("Nicolas"); listModel.addElement("Maurice"); listModel.addElement("Jacques"); listModel.addElement("Mauro"); list = new JList(listModel); list.setSelectedIndex(0); Swing 27 / 27 class MaJFrame extends JFrame { private JLabel e; private JButton b; private JTextField t; private JCheckBox c; MaJFrame(String s) { super(s); Container contentpane = getContentPane(); contentpane.setLayout(null); Insets i = getInsets(); Rectangle r = new Rectangle(i.left+10, i.top+10, 100, 40); e = new JLabel("étiquette",SwingConstants.LEFT); e.setBounds(r); contentpane.add(e); r.x+=20; r.y+=50; t = new JTextField("texte",10); t.setBounds(r); contentpane.add(t); } r.x+=20; r.y+=50; c = new JCheckBox("checkbox",true); c.setBounds(r); contentpane.add(c); } r.x+=20; r.y+=50; b = new JButton("Le bouton"); b.setBounds(r); contentpane.add(b); Swing 26 / 27