SWING Concepts Swing : librairie Java Fournie avec le JDK (Java Development Kit) Quelques classes intégrées dans le JDK1.1.5+ Complètement intégrée à partir de la version 1.2 Avant le JDK1.1.5 : librairie AWT Swing utilise des éléments d'AWT Plus une avancée qu'une remise en cause d'AWT Java Foundation Classes JFC est constituée de 5 API : AWT Java 2D Accessibility Drag and Drop Swing Différences AWT - Swing AWT Composants natifs qui utilisent les widgets du système d'exploitation L'apparence des composants varie selon l'OS Swing Composants dessinés par Java Indépendance vis-à-vis de l'OS L'apparence des composants ne varie pas Parenté AWT -Swing Package Swing (1) javax.swing javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf.* Package Swing (2) javax.swing.table javax.swing.text javax.swing.text.html.* javax.swing.text.rtf javax.swing.tree javax.swing.undo javax.accessibility Composants d'une IHM Fenêtre Composé graphique Contient un objet ou plusieurs objets composés Contient des objets graphiques de type composant et composé Composant graphique Objet graphique de base Patron de conception Composite Fenêtres JWindow JFrame Hérite de la classe AWT : Window Hérite de la classe AWT : Frame JDialog Hérite de la classe AWT : Dialog Comportement « modal » JFrame (1) JFrame La fenêtre la plus utilisée Comportements : Méthode : setDefaultCloseOperation() DO_NOTHING_ON_CLOSE (hérité de AWT) HIDE_ON_CLOSE DISPOSE_ON_CLOSE EXIT_ON_CLOSE JFrame (2) JFRAME LayeredPane rootPane ContentPane GlassPane JFrame (3) MenuBar jframe.setJMenuBar(JMenuBar menu) ContentPane Accesseur Container jframe.getContentPane() Container et pas un J Component comme le J Panel Ajout de composants jframe.getContentPane().add(Component ...) Exemple import java.awt.*; import javax.swing.*; public class Premiere { public static void main(String s[] ) { JFrame fenetre = new JFrame("maFenetre"); JLabel texte = new JLabel ("Bonjour le Monde"); fenetre.getContentPane().add(texte); fenetre.setVisible(true); // show() } } JPanel Une classe incontournable Hérite de JComponent Peu d'impact graphique Noeud idéal dans une arborescence de composants Ajout de composant JPanel panneau = new JPanel(); JLabel texte = new JLabel(''le texte''); panneau.add(texte); Par défaut son Layout Manager est un FlowLayout Exemple import java.awt.*; import javax.swing.*; public class Deuxieme { public static void main(String s[] ) { JFrame fenetre = new JFrame("maFenetre"); JPanel panneau = new JPanel(); JLabel label = new JLabel() ; label.setText("Nom"); label.setIcon(new ImageIcon("icon2.gif"); JTextField champ = new JTextField(); panneau.add(label); panneau.add(champ); fenetre.getContentPane().add(panneau); //fenetre.setContentPane(panneau); fenetre.setVisible(true); } Autres panneaux JScrollPane JTabbedPane Panneau à onglets JSplitPane Panneau avec défilement Panneau séparé en deux parties JDesktopPane Panneau de type bureau Exemple import java.awt.*; import javax.swing.*; public class Troisieme { public static void main(String s[] ) { String texte = new String("AAAAAABBBB ..."); JFrame fenetre = new JFrame("maFenetre"); JScrollPane panneau = new JScrollPane(); JLabel label = new JLabel(texte) ; panneau.setViewportView(label); fenetre.getContentPane().add(panneau); fenetre.setVisible(true); Les menus La classe JFrame possède la faculté de gérer une barre de menus Classe JMenuBar Composition : JMenuBar JMenu JMenuItem separator Les composants d'un menu JMenu JMenuBar JMenuItem separator Exemple (1) import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Quatrieme { public static void main(String s[] ) { JFrame frame = new Jframe("mafenetre"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); JMenuBar cyanMenuBar = new JMenuBar(); cyanMenuBar.setOpaque(true); cyanMenuBar.setBackground(Color.cyan); cyanMenuBar.setPreferredSize(new Dimension(200, 20)); frame.setJMenuBar(cyanMenuBar); frame.getContentPane().add(yellowLabel, BorderLayout.CENTER); frame.pack(); JLabel yellowLabel = new JLabel(""); frame.setVisible(true); yellowLabel.setOpaque(true); } yellowLabel.setBackground(Color.yellow); yellowLabel.setPreferredSize(new Dimension(200, 180)); } Exemple (2) import java.awt.*; import java.awt.event.*; import javax.swing.*; barreMenu.add(fichier); barreMenu.add(edition); barreMenu.setOpaque(true); barreMenu.setBackground(Color.cyan); barreMenu.setPreferredSize(new Dimension(200, 20)); public class Cinquieme { public static void main(String s[] ) { JFrame frame = new Jframe("mafenetre"); JMenuBar barreMenu = new JMenuBar(); JMenu fichier = new jMenu("Fichier"); JMenuItem nouveau = new JMenuItem("mafenetre"); fichier.add(nouveau); fichier.addSeparator(); JMenu edition = new jMenu("Edition"); JMenuItem selection = new JMenuItem("Selection"); edition.add(selection); frame.setJMenuBar(barreMenu); frame.pack(); frame.setVisible(true); } } Les Layouts (1) Gérants de la disposition des composants d'un panneau Permettent de s'affranchir des coordonnées fixes pour placer les composants Implémentent une politique d'agrandissement des fenêtres Ils tendent à faire coincider taille effective des composants et taille idéale : size et preferredSize Appliquent différentes stratégies Les Layouts (2) FlowLayout GridLayout Divise l'espace en lignes et colonnes BoxLayout Aligne les composants de gauche à droite, centrés ou de droite à gauche Aligne les composants les uns à côté des autres verticalement ou horizontalement BorderLayout Il contient 5 cases : centrale, nord, sud, est et ouest Exemple import java.awt.*; import javax.swing.*; public class Sixieme { public static void main(String args[]) { JFrame fenetre = new JFrame() ; fenetre.getContentPane().setLayout( new BorderLayout() ); fenetre.getContentPane().add( new JButton("NORD") , BorderLayout.NORTH); fenetre.getContentPane().add( new JButton("SUD") , BorderLayout.SOUTH); fenetre.getContentPane().add( new JButton("EST") , BorderLayout.EAST); fenetre.getContentPane().add( new JButton("OUEST") , BorderLayout.WEST); fenetre.getContentPane().add( new JButton("CENTRE") , BorderLayout.CENTER); fenetre.setResizable(false); fenetre.setSize(200,200); fenetre.setVisible(true); } } Les composants (1) Label JLabel (javax.swing.Jlabel) Méthodes setText() (supporte le HTML) setIcon() setVerticalTextPosition() setHorizontalTextPosition() Les composants (2) Champs JTextField (javax.swing.JTextField) Méthodes setText() setColumns() copy() cut() paste() Les composants (3) Boutons JButton (javax.swing.JButton) Méthodes setRolloverIcon() setPressedIcon() setMnemonic() setBorderPainted() Les composants (4) Boutons avec état (on-off) JToggleButton (javax.swing.JToggleButton) Méthodes setSelectedIcon() Les composants (5) Radio Boutons JRadioButton (javax.swing.JRadioButton) Méthodes setSelected() Cases à cocher JCheckBox (javax.swing.JCheckBox) Méthodes setText() Les composants (6) Liste déroulante de choix JComboBox (javax.swing.JComboBox) Méthodes setEditable() Les bordures (javax.swing.border.Border) TitleBorder, EtchedBorder, BevelBorder BorderFactory.createTitleBorder(String titre); Les composants (7) Méthodes communes isEnabled() setEnabled() setVisible() isVisible() Exemple import java.awt.*; import javax.swing.*; import java.util.*; public class Septieme { public static void main( String args[]) { Vector items = new Vector(); items.add("Lundi"); items.add("Mardi"); items.add("Mercredi"); items.add("Jeudi"); items.add("Vendredi"); items.add("Samedi"); items.add("Dimanche"); JComboBox cb = new JComboBox(items); JFrame fenetre = new JFrame() ; fenetre.getContentPane().add(cb); fenetre.setVisible(true); } } Apparence Look and Feel Paramétrable (« pluggable ») motif, windows, metal Classe UIManager setLookAndFeel() UIManager.setLookAndFeel() Exemple import java.awt.*; import javax.swing.*; public class Huitieme { public static void main( String args[]) { String motif = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; UIManager.setLookAndFeel(motif); JFrame fenetre = new JFrame() ; JLabel libelle = new JLabel ("texte"); fenetre.getContentPane().add(libelle); fenetre.setVisible(true); } } Taille des composants (1) Taille Taille idéale size ( setSize(), getSize() ) preferredSize ( setPreferredSize(), getPreferredSize() ) Taille minimale minimumSize ( setMinimumSize(), getMinimumSize() ) Taille des composants (2) Les Layout Manager respectent soit : minimumSize preferredSize La méthode pack() appliquée sur la fenêtre Calcul récursif des tailles sur l'arborescence des composants et adaptation Si taille toujours inadaptée Réécrire les méthodes getPreferredSize() ou getMinimumSize() des composants Positionner une taille par setSize() (attention portabilité) Position sur l'écran Récupération de la taille de l'écran Classe Toolkit Méthode getScreenSize() Positionnement Objet fenêtre méthode setLocation() Exemple import java.awt.*; import javax.swing.*; public class Neuvieme { public static void main( String args[]) { JFrame fenetre = new JFrame() ; JLabel libelle = new JLabel ("Bonjour Le Monde"); fenetre.getContentPane().add(libelle); //fenetre.pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); fenetre.setVisible(true); } } Les événements (1) Programmation événementielle méthodes associées à des événements sur les composants permet l'implémentation de la logique applicative Evénements souris, clavier, écran Langages événementiels Xwindow, Motif, VB, Java AWT-Swing, Smalltalk, etc Basés sur le patron de conception Observateur Patron de conception Observateur Les événements (2) Classes d'événements Intéraction utilisateur Evénement émis Passage du focus à un composant FocusEvent Clic sur un JPanel MouseEvent Frappe d'une touche clavier sur un JPanel KeyEvent Iconification d'une fenêtre WindowEvent Clic sur un bouton ActionEvent Ajout d'une lettre dans un JTextField DocumentEvent Sélection d'un item dans une JList ListSelectionEvent Les événements (3) Observateurs swing les listeners 1 -Attachement Bouton listener 2 -Clic 3 - Notification Les événements (4) Package java java.awt.event.* Attachement par la méthode : addActionListener(ActionListener objet) Interface ActionListener Méthode : actionPerformed(ActionEvent e) Il faut l'implémenter Notification Gérée par le langage Exemple (1) import java.awt.* ; import javax.swing.* ; import java.awt.event.* ; public class Dixieme { public static void main(String args[]) { JFrame fenetre = new JFrame(); JButton bouton = new JButton("Cliquez"); bouton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { JDialog dialogue = new JDialog(); JLabel message = new Jlabel("Merci"); dialogue.getContentPane().add(message); dialogue.setModal(true); dialogue.setVisible(true); } }); fenetre.getContentPane().add(bouton); fenetre.setVisible(true); } } Exemple (2) public class MonListener implements ActionListener { private String msg = "Merci"; private JFrame mere; public MonListener(JFrame mere) { this.mere = mere; } public void actionPerformed(ActionEvent e) { JDialog dialogue = new JDialog(); JLabel message = new Jlabel(msg); dialogue.getContentPane().add(message); dialogue.setModal(true); dialogue.setVisible(true); dialogue.setLocationRelativeTo(mere); } } Exemple (2) suite public class Fenetre implements JFrame { public Fenetre() { JButton bouton = new JButton(); MonListener listener = new MonListener(this); bouton.addActionListener(listener); } }