Le graphisme Utilisation de Swing Swing • Swing : bibliothèque assez complète sur le graphisme • Toutes les applications ont le même « look » quel que soit le système d'exploitation (Windows, Linux, …) • Inconvénient : Swing est un peu lent • Inconvénient : Swing est (un peu) complexe à manipuler Fenêtres • Peuvent être créées en utilisant un objet JFrame • La classe JFrame dispose de nombreuses méthodes permettant de créer et modifier les attributs des fenêtres • Un objet JFrame est invisible par défaut. Il faut appeler la méthode setVisible(true) • La hauteur et la largeur sont précisées en pixels • Quelques attributs des JFrame – titre – hauteur – largeur • Pourquoi JFrame au lieu de Frame ? La classe MaFrame import javax.swing.JFrame; public class MaFrame extends JFrame{ public public public public static static static static final final final final int int int int HAUTEUR = 800; // Constantes LARGEUR = 600; POSITION_X = 50; POSITION_Y = 100; public MaFrame(){ // Constructeur setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocation(POSITION_X, POSITION_Y); setSize(LARGEUR, HAUTEUR); setResizable(false); d'où viennent } ces méthodes ? La méthode main public static void main(String [] args){ MaFrame frame = new MaFrame(); frame.setVisible(true); } ● ● Nous créons la fenêtre et nous la rendons visible La classe MaFrame hérite de la classe JFrame ● toutes les méthodes de JFrame sont donc disponibles dans notre classe MaFrame ● MaFrame est une classe JFrame spécialisée La méthode setDefaultCloseOperation • Indique à Java quoi faire quand l'utilisateur clique sur la croix en haut à droite de la fenêtre • JFrame.EXIT_ON_CLOSE le programme se termine • JFrame.DISPOSE_ON_CLOSE la fenêtre se ferme mais le programme continue • JFrame_HIDE_ON_CLOSE la fenêtre est cachée mais peut peut redevenir visible avec la méthode setVisible(true) • JFrame_DO_NOTHING_ON_CLOSE la fenêtre ne se ferme pas et le progtamme continue Architecture de l'écran Méthodes de JFrame • setLocation(x,y) : indique la position en haut à gauche de la fenêtre • setSize(largeur,hauteur) : indique la taille de la fenêtre en pixels • setResizable(false) : indique que la fenêtre n'est pas redimensionnable • Comment déterminer la taille de l'écran ? Dimension tailleEcran = Toolkit.getDefaultToolkit().getScreenSize(); System.out.println("Hauteur de l'écran en pixels :" + tailleEcran.height); System.out.println("Largeur de l'écran en pixels :" + tailleEcran.width); Comment écrire/dessiner dans la fenêtre • On instancie un objet qui hérite de la classe JPanel • On ajoute l'objet à la fenêtre (au JFrame) • JPanel a une méthode intéressante : – void paintComponent(Graphics g) – cette méthode est exécutée à chaque fois que le JPanel a besoin d'être (ré)-affiché • Un objet JPanel a les propriétés suivantes : – on peut dessiner à l'intérieur – c'est un conteneur : on peut y ajouter d'autres objets graphiques (boutons, ascenseurs, labels, ...) Méthode paintComponent • Définie dans la classe JPanel • Cette méthode est appelée automatiquement à chaque fois que la fenêtre a besoin d’être ré-affichée • La méthode peut être explicitement appelée par la méthode repaint() • On n’appelle jamais la méthode paintComponent() directement Bonne pratique d’utilisation de paintComponent() • Les programmeurs débutants mettent en général de nombreuses instructions dans la méthode paintComponent() • Ce n’est pas l’approche correcte • Le résultat est que chaque fois que la fenêtre est ré-affichée ce code est ré-exécuté • Une meilleure approche est d’utiliser la méthode paintComponent() pour réaliser juste l’affichage • Les calculs sont effectués ailleurs Comment ajouter un JPanel • On crée un classe qui hérite de JPanel et on l'ajoute à la frame par la méthode add • Pour le moment, on n'ajoute qu'un JPanel, en ajouter plusieurs est un peu plus complexe public MaFrame(){ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocation(POSITION_X, POSITION_Y); setSize(LARGEUR, HAUTEUR); setResizable(false); MonPanel panel = new MonPanel(); add(panel); m é t h o de hérité ed e J F rame } JPanel - paintComponent • C'est par la surcharge de la méthode paintComponent de JPanel que l'on va pouvoir faire des dessins • Chaque JPanel permet d’accéder à un objet de type Graphics qu’il contient. C’est cet objet qui permet de manipuler le graphisme au sein d’un composant • Comme pour la JFrame, chaque JPanel contient son propre système de coordonnées import javax.swing.JPanel; import java.awt.Graphics; public class MonPanel extends JPanel { appel de la méthode drawRect qui dessine des rectangles ! public void paintComponent(Graphics g){ g.drawRect(10,10,200,200); } } Document Dessiner par exemple un rectangle import javax.swing.JPanel; import java.awt.Graphics; import java.awt.Color; public class MonPanel extends JPanel { public void paintComponent(Graphics g){ g.drawRect(10,10,200,200); } } Écrire sur écran – Les fontes • Il est possible de créer un objet Font et de l’utiliser pour afficher du texte • Font maFonte = new Font("SansSerif",Font.Bold,40) ; spécifie le nom de la fonte, le style et la taille • Les fontes toujours présentes : – SansSerif – Serif – Monospaces – Dialog – DialogInput import import import import import import javax.swing.JPanel; java.awt.Graphics; java.awt.Graphics2D; java.awt.geom.Rectangle2D; java.awt.Color; java.awt.Font; public class MonPanel extends JPanel { Font maFonte = new Font("SansSerif",Font.BOLD,40); public void paintComponent(Graphics g){ g.drawRect(10,10,200,200); g.setFont(maFonte); g.drawString("Ce cours de Java",20,60); g.drawString("est excellent",20,100); } méthode drawString de la classe Graphics Quelques infos utiles • Obtenir toutes les fontes disponibles : – String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFont FamilyNames(); • Obtenir la taille du JPanel – méthodes getWidth() (largeur) et getHeight() (hauteur) – Et les couleurs ? • La classe Color permet de travailler avec les couleurs • g.setColor(new Color(20,30,40)); positionne les couleurs rouge, verte et bleue sur une échelle de 0 à 255 • on peut aussi utiliser g.setColor(Color.RED) ; • La méthode setColor change la couleur du pinceau • Graphics2D • La méthode getBackground retourne la couleur du fond • La méthode setBackground change la couleur du fond