Le graphisme

publicité
Le graphisme
Utilisation de Swing et Awt
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
Conteneurs et composants
Deux types de éléments dans l'IG proposé par défaut
● les composants (comme les boutons, les champs textuels,…)
● les conteneurs (principalement les cadres Frame et les
panneaux Panel) qui sont utilisés pour y positionner des
composants.
● Un conteneur peut contenir d'autres conteneurs
Exemple
• il y a dans l'exemple ci-dessus trois conteneurs (une Frame et
deux Panel)
• La Frame contient deux Panel
• Il y a 5 composants (deux dans le premier Panel, trois dans le
second)
Fenêtre / Frame
• La Frame est l'objet le plus classique
– La Frame est en général la fenêtre principale
– possède une barre de titres
– un icône
– des boutons de réduction – maximisation - agrandissement
Fenêtre (conteneur de base)
• Peuvent être créées en utilisant un objet JFrame ou en
héritant de 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
La classe MaFrame
import javax.swing.JFrame;
public class MaFrame {
public
public
public
public
static
static
static
static
final
final
final
final
int
int
int
int
HAUTEUR = 800;
LARGEUR = 600;
POSITION_X = 50;
POSITION_Y = 100;
public MaFrame(){
d'où viennent
ces méthodes
JFrame maFrame = new JFrame();
maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
maFrame.setLocation(POSITION_X, POSITION_Y);
maFrame.setSize(LARGEUR, HAUTEUR);
?maFrame.setResizable(false);
maFrame.setTitle("année 2015 2016");
maFrame.setVisible(true);
}
public static void main(String [] args){
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);
MaFrame test = new MaFrame();
}
}
La méthode main
public static void main(String [] args){
MaFrame test = new MaFrame();
}
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 programme 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
• La classe MonPanel hérite de la classe JPanel
– toutes les méthodes de JPanel sont donc disponibles
dans notre classe MonPanel
– MonPanel est une classe JPanel spécialisée
• 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, ...)
Comment ajouter un
JPanel
• On crée un classe qui hérite de JPanel et on l'ajoute à la
JFrame par la méthode add
• Pour le moment, on n'ajoute qu'un JPanel, en ajouter plusieurs
est un peu plus complexe
public MaFrame(){
maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
maFrame.setLocation(POSITION_X, POSITION_Y);
maFrame.setSize(LARGEUR, HAUTEUR);
maFrame.setResizable(false);
MonPanel panel = new MonPanel();
maFrame.add(panel);
m
é
t
h
o
de h
é
r
i
t
é
e de
J
F
r
ame
}
Exemple rajouter un JPanel
La méthode add ou setContentPane de Jframe permet d'ajouter
un conteneur
public MaFrame(){
maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
maFrame.setLocation(POSITION_X, POSITION_Y);
maFrame.setSize(LARGEUR, HAUTEUR);
maFrame.setResizable(true);
maFrame.setTitle("année 2015 2016");
MonPanel2 p2 = new MonPanel2();
maFrame.setContentPane(p2);
}
JPanel (suite)
• Le JPanel est un conteneur
• Il peut contenir d'autres objets
– Du texte
– Des boutons
– Des boîtes de dialogue
– Des images
• Nous allons rajouter du texte (JLabel)
Exemple
import javax.swing.JPanel;
import javax.swing.JLabel;
public class MonPanel2 extends JPanel {
public MonPanel2(){
JLabel label1 = new JLabel("premier texte");
add(label1);
JLabel label2 = new JLabel("second texte");
add(label2);
}
}
Ajouter un bouton dans le
JPanel
• Classe JButton
• https://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.
html
• Comme toutes les classes de Swing, il y a de nombreux
constructeurs différents
Affichage
JButton bouton =
new JButton("un bouton");
add(bouton);
Un champ de saisie de
texte
• Classe JTextField
• Comme tous les objets, un objet JTextField se rajoutent dans
un container comme un JPanel
Comment agencer tout ça ?
• Par défaut, tous les éléments que l'on place dans le JPanel
sont placés les uns à côté des autres
• Java propose 6 gestionnaires de placement et il est possible
de créer le sien (LayoutManager)
– FlowLayout gestionnaire par défaut (les uns à côté des autres)
– BorderLayout : conteneur divisé en 5 zones: nord, sud, est, ouest, centre
– GridLayout : grille virtuelle
– BoxLayout : les uns à côté des autres (X_AXIS) ou les uns au-dessus
des autres (Y_AXIS)
– CardLayout : superpose les objets les uns au-dessus des autres
– GridBagLayout : positionnement sous forme de grille où les cellules
peuvent être configurées par l'utilisateur
Exemple
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.GridLayout;
public class GridLayoutExemple extends JPanel {
public GridLayoutExemple(){
setLayout(new GridLayout(3,2));
JLabel label1 = new JLabel("premier texte");
add(label1);
JLabel label2 = new JLabel("second texte");
add(label2);
JButton bouton = new JButton("un bouton");
add(bouton);
JTextField texte = new JTextField("test ");
add(texte);
}
}
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
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);
}
}
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
É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().getAvailableFontF
amilyNames();
• 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
•
D'autres moyens
• Utilisation d'outils dédiés comme WindowsBuilder
• C'est un plugin d'eclipse
Code généré
/**
* Create the application.
*/
public WindowsTest() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
frame.getContentPane().add(tabbedPane, BorderLayout.NORTH);
JPanel panel = new JPanel();
tabbedPane.addTab("New tab", null, panel, null);
JPanel panel_1 = new JPanel();
tabbedPane.addTab("New tab", null, panel_1, null);
}
}
Résumé
• Créer une JFrame
• Créer un ou plusieurs JPanel
• Créer éventuellement un gestionnaire de positionnement
(layout)
– mettre le ou les JPanel dans la JFrame
– rajouter des widgets (boutons, ascenseurs,….)
– si vous voulez dessiner sur l'écran
• surcharger la méthode paintComponent()
Téléchargement