Interfaces graphiques
Composants d'interface utilisateur graphique (GUI) 1 Bibliothèques Awt et Swing Procédures communes pour l'utilisation de ces clases : Créer un cadre Créer des composants dans ce cadre Mettre en page ces composants Écrire des méthodes réagissant aux actions de l'utilisateur AWT (Abstract Windowing Toolkit) : première bibliothèque, depuis Java 1. Peu de composants Complétée par Swing depuis Java 2
Composants d'interface utilisateur graphique (GUI) 2 Principaux composants : awtswing Boutons ButtonJButton LabelsLabelJLabel Case à cocherCheckboxJCheckBox Groupe de boutons radioCheckboxGroupButtonGroup Listes déroulantesListJList, JComboBox Zones de texteTextFieldJTextField Zones de texte multi-lignesTextAreaJTextArea AscenseursScrollBarJScrollBar etc...
Composants d'interface utilisateur graphique (GUI) 3 Conteneurs Cadres dans lesquels sont placés les composants. Ex JPanel : panneau, volet d'affichage JFrame : JPanel avec barre de menu JDialog: boîte de dialogue JScrollPane : fenêtre avec ascenseurs JTabbedPane : fenêtre à onglets
Composants d'interface utilisateur graphique (GUI) 4
Disposition des composants (layout) - 1 On peut définir la disposition géométrique des composants dans un conteneur. Par défaut : FlowLayout //BorderLayout : conteneur.setLayout(new BorderLayout()); conteneur.add(new JButton("North"), BorderLayout.NORTH); conteneur.add(new JButton("Center"), BorderLayout.CENTER);...
Disposition des composants (layout) - 2 GridLayout : conteneur.setLayout(new GridLayout(3,2) ); for(int i=1; i< =6; i++) conteneur.add(new JButton(""+i));
Disposition des composants (layout) - 3 GridBagLayout et GridBagConstraints Chaque composant est associé à une instance de GridBagConstraints qui indique la disposition du composant dans la grille. On peut ainsi disposer les composants librement.
Gestion d'évènements 1 Les gestionnaires (écouteurs) d'évènements permettent d'intercepter les actions des utilisateurs et d'assigner au programme un comportement adapté en réponse. Démarche Définir l'objet sur lequel on veut gérer les évènements (ex JPanel ) Définir une classe (1) implémentant une interface gestionnaire d'évènements (ex MouseListener ) (2) ou héritant d'une classe gestionnaire d'événement (ex MouseAdapter ) Surcharger toutes (1) ou certaines(2) méthodes de cette classe. Associer l'objet ( JPanel ) à l'écouteur d'évènements (ex addMouseListener() )
Gestion d'évènements 2 // Définir le gestionnaire d'évènements class MyMouseAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) { // le code défini ici sera exécuté lors d'un clic } // Panel sur lequel on veut gérer les clics souris class UnPanel extends JPanel { UnPanel () { // associer à l'écouteur d'évènements addMouseListener(new MyMouseAdapter()); }... }
Gestion d'évènements 3 // Même chose en utilisant une classe anonyme // Panel sur lequel on veut gérer les clics souris class UnPanel extends JPanel { UnPanel () { // associer à l'écouteur d'évènements addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { // le code défini ici sera exécuté // lors d'un clic } } );... }
Gestion d'évènements 4 // L'objet peut être son propre écouteur d'évènement // Panel sur lequel on veut gérer les clics souris class UnPanel extends JPanel implements MouseListener { UnPanel () { // associer à l'écouteur d'évènements : l'objet lui-même addMouseListener(new MouseAdapter(this) ); } // Surcharger toutes les méthodes de l'interface public void mouseClicked(MouseEvent e) { // le code défini ici sera exécuté lors d'un clic } public void mousePressed (MouseEvent e) {} public void mouseReleased(MouseEvent e) {}... }
Une application Swing Cet exemple d'application swing comprend : Une fenêtre principale, de classe JFrame Un "panneau" de classe JPanel Un bouton JButton Une zone d'affichage JLabel JFrame JPanel JButton JLabel
Code de l’application import java.awt.*; import javax.swing.*; class Exemple { Exemple() { mainFrame = new JFrame("Exemple d'application"); mainPanel = new JPanel(); bouton = new JButton("Bouton Swing"); label = new JLabel("Nombre de clics : 0"); mainPanel.setLayout(new GridLayout(2,1)); mainPanel.add(bouton); mainPanel.add(label); mainFrame.getContentPane().add(mainPanel); mainFrame.setSize(300,200); mainFrame.show(); } public static void main(String args[]) { new Exemple(); } private JFrame mainFrame; private JPanel mainPanel; private JButton bouton; private JLabel label; }
Code de l’application - 2 // L’application doit se terminer si on ferme la fenêtre // principale... import java.awt.event.*;... mainFrame = new JFrame("Exemple d'application"); mainFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });... }
Code de l’application - 3 // Gestion des actions sur le bouton bouton = new JButton("Bouton Swing"); bouton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { nbClics++; label.setText(prefix + nbClics); } });... private final String prefix = "Nombre de clics : "; private int nbClics = 0;
Dessiner dans un JPanel Toutes les instructions graphique doivent être appelées dans la méthode protected void paintComponent(Graphics g) Cette méthode est applelée automatiquement quand le widget doit être affiché. Elle doit être redéfinie dans une classe dérivée de JPanel. On utilise le paramètre g de classe Graphics (cf. doc); Exemple : class unPanel extends JPanel { protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawLine( 10,10, 200, 100); } On peut provoquer explicitement le réaffichage du panneau en appelant sa méthode repaint();
Utiliser la souris Utiliser la classe Mouse Adapter addMouseListener ( new MouseAdapter() { public void mouseClicked(MouseEvent e) { // e.getX() et e.getY() donnent les // coordonnées du curseur au moment du clic... } );