cours - LISIC

publicité
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
Téléchargement