TP5 - LIPN

publicité
C. Recanati
IG, Java Swing
Info2, 2008
TP n° 5
Exercice 1 Le but de cet exercice est de visualiser différents bords.
1) Ecrire une classe Bords qui étend JFrame et affiche dans son
main une instance placée au milieu de l’écran (utiliser getToolkit
pour récupérer la dimension de l’écran).
2) Ecrire un constructeur qui prend en argument un titre et place
dans la fenêtre six objets de type JLabel sur une grille 2x3.
3) Les labels vont servir à tester des bords et on affichera, comme
texte du label, le nom du type de bord qui l’entoure.
Essayez différents bords (e.g. BevelBorder, EmptyBorder,
EtchedBorder, LineBorder et TitledBorder) avec différents
arguments.
 Indications : Pour créer un objet Border on peut
 utiliser un constructeur de bord, par exemple
button.setBorder (new EtchedBorder ());
 demander à BorderFactory de le faire (il y a des méthodes
spécifiques comme createBevelBorder ou
createTitledBorder qui créent des bords).
4) Mettez à l’un des labels un bord composé (CompoundBorder).
Composez par exemple, un cadre (d’une couleur donnée), et un titre
(dans une fonte donnée).
Exercice 2 (reprise de TP 1 et TP4): le but de cet exercice est de créer une
application qui tire (aléatoirement) et mémorise un ensemble de points, et
les affiche selon différents modes (sous forme de ronds, de croix, ou comme
polygone).
Un point est une instance de la classe java.awt.Point. L’ensemble de
points sera mémorisé dans un vecteur ensPts de la classe
principale. Un champ mode (entier) indique le mode d’affichage des
points. Il y a trois modes d’affichage différents, définis par des
constantes nommées :
- rond : les points seront dessinés comme de petits ovales;
- croix : les points seront dessinés sous forme de croix ;
- poly : le polygone joignant les points sera dessiné ;
1) Ecrire une interface définissant les constantes pour le mode
d’affichage dans un fichier séparé. Se servir de cette interface dans
l’application pour initialiser le champ mode par rond.
2) Ecrire une méthode initAleatoire ayant trois paramètres: nb,
le nombre de points que l’on souhaite générer, et la largeur et la
hauteur du cadre (fenêtre) qui contiendra les points. Cette méthode
crée nb objets de type Point dont les coordonnées (positives) se
situent dans le cadre indiqué, et elle les range dans le vecteur
ensPts de la classe principale.
 Pour le tirage aléatoire des points, on trouve dans la classe Math
une méthode random() qui retourne un double compris entre 0.0
et 1.0. et une méthode round(double a) qui retourne l’entier
(long) le plus proche de a.
3) Ecrire une sous-classe Dessin de JFrame qui possède les deux
constructeurs suivants :
a) un constructeur à deux arguments permettant de définir le
titre de la fenêtre et le mode d’affichage des points. Vous
supposerez d’abord que l'entier passé en paramètre est une
valeur de mode correcte.
b) un constructeur à un argument permettant de définir le titre
de la fenêtre et fixant le mode graphique à rond.
4) Créez un JPanel (ajouté au contentPane du JFrame), et
affichez les points dans ce JPanel en redéfinissant la méthode
paintComponent du JPanel. Testez dans un main l’affichage en
mode rond.
5) Testez l’application pour les autres modes en définissant une
boucle créant plusieurs cadres et en faisant varier l’origine de ces
cadres et leur mode d’affichage.
6) Traitez le cas où le mode passé en argument au constructeur de
la fenêtre n’est pas l'un des 5 modes préconisés (vous gérerez cette
erreur par le traitement d'une exception).
Exercice n° 3
1) Transformer l’application de l’exercice 1 en applet. Pour cela,
créer une procédure init() qui modifie le contenu du JApplet
(sans vous occuper du positionnement de la fenêtre).
2) Ecrire un fichier html comportant la balise APPLET
correspondant à votre code java et tester la visualisation de ce
fichier avec appletviewer.
 pour appletviewer, il suffit de définir la balise APPLET (il
ignore les autres définitions html) et de lancer la commande
% appletviewer file.html
Eléments de correction :
exercice 1 : Bords.java
question 1 : voir poly p.292
questions 2 et 3 : s’inspirer de ce programme qui teste des bords
sur des objets de type JLabel.
import
import
import
import
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.border.*;
public class Bords extends JFrame{
public Bords (String title) {
super(title);
// récupérer le panneau de contenu
// et lui attribuer un gestionnaire d’affichage
// pour ses futurs éléments
Container content = getContentPane();
content.setLayout (new GridLayout (2, 3, 10, 10));
// créer les labels et les boutons et les ajouter
// au panneau de contenu
JLabel label;
label= new JLabel("LineBorder Gray");
label.setBorder (LineBorder.createGrayLineBorder());
content.add (label);
label= new JLabel("EmptyBorder 5");
label.setBorder(new EmptyBorder(5,5,5,5));
content.add (label);
label= new JLabel("Titled CENTER TOP");
label.setBorder(new TitledBorder(
LineBorder.createBlackLineBorder(),
"Press Me",
TitledBorder.CENTER,
TitledBorder.TOP,
new Font ("Serif", Font.ITALIC, 14),
Color.blue));
content.add (label);
/* etc … */
Border etched, blackline;
blackline= BorderFactory.createLineBorder(Color.black,
4);
etched = BorderFactory.createEtchedBorder();
//Simple borders
label= new JLabel("LineBorder black");
label.setBorder(blackline);
content.add (label);
//Titled borders
TitledBorder title ;
title = BorderFactory.createTitledBorder(blackline,
"titled");
title.setTitleJustification(TitledBorder.CENTER);
label = new JLabel("Titre centre");
label.setBorder(title);
content.add (label);
…
//faire un label avec un bord composé
…
}}
// exercice 2 : Dessin.java pour TP5
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class Dessin extends JFrame {
Vector ensPts ; // stocke les points à afficher
/* mode d'affichage de l'ensemble des points
rond : petits ronds
croix : petites croix
poly : comme polygone
*/
int mode;
MonJPanel pane; // le panneau dans lequel on dessine
// constantes définies normalement dans une interface
final static int rond=0,croix=1,poly=2;
static int modeMin=rond, modeMax=poly;
private void init(int i) {
mode=i;
ensPts = new Vector();
this.setBackground(Color.white);
}
public Dessin(String titre, int i)throws Exception {
// traitement pour la dernière question
super(titre);
if (i < modeMin || i > modeMax)
throw new Exception("mode " + i +" incorrect");
this.init(i);
Container content = getContentPane();
pane = new MonJPanel();
content.add(pane, BorderLayout.CENTER);
}
public Dessin(String titre) {
super(titre);
this.init(rond);
Container content = getContentPane();
pane = new MonJPanel();
content.add(pane, BorderLayout.CENTER);
}
public class MonJPanel extends JPanel {
public void paintComponent(Graphics g)
super.paintComponent(g) ;
g.setPaint(Color.red);
{
int nbPoints = ensPts.size();
int[] abs = new int[nbPoints];
int[] ords = new int[nbPoints];
for(int i=0; i<nbPoints; i++) {
Point p= (Point)ensPts.elementAt(i);
abs[i]=p.x;
ords[i]=p.y;
}
switch(mode){
case rond :
for(int i=0; i<nbPoints; i++) {
g.drawOval(abs[i], ords[i], 5, 5);
}
break;
case croix :
for(int i=0; i<nbPoints; i++)
g.drawLine(…);
g.drawLine(…);
}
{
break;
case poly :
…
break;
}
// end switch
}
// end paintComponent
} // end MonJPanel
public void initAleatoire(int nb,
int larg, int haut) {
for (int i=0; i<nb ; i++) {
Point p = new Point(
(int) Math.round(Math.random()*larg),
(int) Math.round(Math.random()*haut));
ensPts.addElement(p);
}
}
public void setPaneSize(int largeur, int hauteur) {
pane.setSize(largeur, hauteur);
pane.setPreferredSize(
new Dimension(largeur,hauteur));
}
public static void main (String args[]) {
int largeur=800,hauteur=500;
for (int i=Dessin.modeMin;
i<=Dessin.modeMax ; i++){
try {
Dessin f = new Dessin("Dessin de points "
+ i,i);
f.setPaneSize(largeur, hauteur);
f.initAleatoire(12, largeur, hauteur);
f.pack();
f.setLocation(20*i, 20*i);
f.setVisible(true);
}
catch (Exception e){
System.out.println(e);
}
}
}
}
// exercice 3 : voir poly p.271 et suivantes + p.315
//le fichier Dessin.java modifié et compilé avec javac
public class Dessin extends JApplet {
...
}
// le fichier html visualisé avec appletviewer
<HTML>
<TITLE> Applet Dessin </TITLE>
<APPLET CODE="Dessin.class"
WIDTH =800 HEIGHT = 500 >
</APPLET>
</HTML>
Téléchargement