C.
RECANATI
IHM Java
Swing
DESS EID
2004/2005
TP n¡ 4
Exercice 1: le but
de cet exercice est de tester différentes sortes de
bords.
1) Ecrire une
classe Bordures qui affiche dans son main une
fenêtre placée au milieu de l’écran
(utiliser getToolkit).
2) Ecrire un constructeur qui
prend en argument un titre et place dans la fenêtre des objets de type
labels sur une grille 2x3. Ces labels serviront à tester
différents bords et on affichera (comme texte du label) le nom de la
bordure qu’ils illustrent.
Essayez plusieurs bords (e.g.
BevelBorder, EmptyBorder, EtchedBorder, LineBorder et TitledBorder) avec divers arguments.
3) Rajouter à
l’un des labels un bord composé (CompoundBorder)
avec, par exemple, un cadre et un bord de couleur, plus un titre dans une fonte
donnée.
F pour créer
un objet Border on peut :
soit utiliser le
constructeur de classe approprié, par exemple
button.setBorder (new
EtchedBorder ());
soit demander
à BorderFactory de le créer avec des
méthodes appropriées (ex createBevelBorder ou createTitledBorder).
Exercice
2: (reprise de l’exercice 1 du
TP n°1). Le but de cet exercice est de créer
une application qui mémorise un ensemble de points tirés
aléatoirement et les affiche selon différents modes (sous forme
de petits ronds, de petites croix, ou comme un polygone).
Un point sera 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) indiquera le mode d’affichage des
points. Il y aura 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 à rond.
2)
Ecrire une méthode initAleatoire
prenant trois paramètres: nb, le nombre de
points que l’on souhaite stocker, et la largeur et la hauteur du cadre
qui englobera les points. Cette méthode crée nb Points dont les coordonnées positives se situent dans le cadre indiqué, et les stocke
dans le vecteur ensPts
de la classe
principale.
F Pour le tirage aléatoire des points, on trouvera dans la classe Math la méthode random() qui retourne un double compris entre 0.0 et 1.0. et la 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 constructeurs
suivants :
a)
un constructeur à deux arguments permettant de
définir le titre de la fenêtre et le mode d’affichage
graphique. Vous supposerez d’abord que l'entier passé en
paramètre a une valeur 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 l’affichage
en mode rond.
Si vous avez du
temps
5) Testez l’application
pour les autres modes en définissant dans le main une boucle créant plusieurs JFrame, en faisant
varier l’origine de ces cadres et le mode d’affichage
à chaque fois.
6) Traitez le cas où
le mode passé en argument au constructeur de la fenêtre ne coïncide pas avec l'un des 5 modes
préconisés. (Gérez cette erreur par un traitement
d'exception).
Exercice
3:
1) Transformer
l’application de l’exercice 1 en applet. Pour
cela, créer une procédure init() qui modifiera
simplement le contenu du JApplet, sans s’occuper du positionnement de la
fenêtre.
2) Ecrire un fichier html
comportant la balise APPLET correspondante. Tester votre fichier avec
appletviewer.
F
pour appletviewer, il suffit de définir la balise APPLET (il
ignore les autres définitions html).
Eléments
de correction :
// exercice 1 : Bordures.java
// Attention : ce programme teste des bords pour des objets JButton
import
java.awt.*;
import
java.awt.event.*;
import
javax.swing.*;
import
javax.swing.border.*;
public
class Bordures extends JFrame{
public
Bordures (String title) {
super(title);
Container content =
getContentPane();
content.setLayout (new
GridLayout (3, 3, 10, 10));
JLabel
label;
JButton
button;
label= new
JLabel("LineBorder Gray");
label.setBorder
(LineBorder.createGrayLineBorder());
content.add
(label);
…
button= new
JButton("EmptyBorder");
button.setBorder(new
EmptyBorder(5,5,5,5));
content.add
(button);
…
button= new
JButton("Titled center top");
button.setBorder(new
TitledBorder(
LineBorder.createBlackLineBorder(),
"Press
Me",
TitledBorder.CENTER,
TitledBorder.TOP,
new
Font ("Serif", Font.ITALIC, 14),
Color.blue));
content.add
(button);
…
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);
…
} … main comme celui du cours …}
// exercice 2 : Dessin.java pour TP4
import
java.awt.*;
import
javax.swing.*;
import
java.util.*;
public
class Dessin extends JFrame {
Vector ensPts ; // stocke les points à
afficher
final static int
rond=0,croix=1,poly=2;
static int modeMin=rond,
modeMax=poly;
int mode; /* mode d'affichage de l'ensemble des
points
rond : petits ronds
croix : petites croix
poly
: polygone
*/
JMonPanel pane; // le panneau
dans lequel on dessine
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(i + " ");
this.init(i);
Container
content = getContentPane();
pane
= new JMonPanel();
content.add(pane,
BorderLayout.CENTER);
}
public Dessin(String
titre) {
super(titre);
this.init(rond);
Container
content = getContentPane();
pane
= new JMonPanel();
content.add(pane,
BorderLayout.CENTER);
}
public class JMonPanel
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;
} // fin switch
} //
fin paintComponent
} // fin JMonPanel
public void
initAlea(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.initAlea(12,
largeur, hauteur);
f.pack();
f.setLocation(20*i,
20*i);
f.setVisible(true);
}
catch
(Exception e){
System.out.println(e);
}
} } }