On se propose de réaliser une applet qui permet de visualiser la gestion des couleurs utilisables dans les modes RVB (rouge, vert, bleu) et HSB (teinte, saturation, luminosité). Pour modifier la couleur dans chaque mode, il faut introduire trois nombre entiers. En mode RVB chaque valeur est comprise entre 0 et 255. En mode HSB la couleur est un nombre compris entre 0 et 360, la saturation et la luminosité sont compris entre 0 et 100. On fera un contrôle de validité des valeurs entrées. On se propose d'afficher la couleur obtenue dans un cadre et d'utiliser la couleur complémentaire comme couleur du fond d'une partie de l'applet. Le programme proposé offre une solution possible parmi beaucoup d'autres. Il existe en particulier de nombreuses possibilités pour effectuer la mise en place des composants nécessaires au fonctionnement.
Pour le cadre, on fait le choix d'utiliser un canevas (Canvas). Ce composant impose la surcharge de sa méthode paint( ) : il faut donc définir obligatoirement une classe spécifique. Nous utilisons la classe Cadre qui étend la classe Canvas. Cette classe contient uniquement la variable publique Color col qui sera utilisée comme couleur de pinceau et la méthode paint( ).
La saisie des valeurs de la couleur en mode RVB ou HSB suppose la mise en place pour chaque cas de 3 zones de texte. Au lieu de définir 6 zones, il est plus simple de définir deux objets identiques qui seront paramétrés pour chacun des deux cas. On va donc construire une classe Panneau qui va étendre la classe Panel. Cette classe va comporter un constructeur permettant le paramétrage des zones de texte et des libellés associés et la méthode action( ) qui va implémenter la réaction du programme aux commandes de l'utilisateur. Pour chaque panneau, il faut introduire 6 composants (3 labels et 3 zones de texte) L'utilisation d'un gestionnaire du type GridLayout avec 2 colonnes de 3 lignes semble être le meilleur choix.
La classe principale est l'applet. La méthode init( ) effectue la mise en place des deux panneaux et du canevas avec un gestionnaire FlowLayout. Un gestionnaire GridLayout avec 1 ligne de 3 colonnes est aussi utilisable. La réponse aux actions de l'utilisateur est implémentée dans la méthode mise_a_jour mais le code correspondant à cette méthode aurait pu être introduit dans la méthode action de la classe Panneau. La méthode paint( ) de cette classe assure la mise à jour finale de l'affichage.
import
java.applet.*;
import java.awt.*;
public
class ColorTest extends Applet
{ Panneau panRGB,panHSB; //déclaration
des objets Panneau
Cadre
canv; //déclaration objet
Cadre
Color
c1,c2;
Font font = new Font("Helvetica",0,11);
Font
bold = new Font("Helvetica",1,18);
public
void init()
{ setFont(font);//la
taille de la fonte conditionne celle des panneaux
setBackground(Color.lightGray);
//couleur du fond de l'applet
setLayout(new
FlowLayout(1,40,5)); //protocole
de mise en page global
canv
= new Cadre(); //création
du Cadre
panRGB
= new Panneau(this,"Rouge","Vert","Bleu"); //appel
constructeur
panHSB
= new Panneau(this,"Teinte","Saturation","Luminosité");
add(panRGB);
//ajout 1er panneau
add(canv);
//ajout du Cadre à coté
du panneau
canv.setFont(bold);//fonte
du Cadre
canv.resize(100,60);
//taille du Cadre
add(panHSB);
panRGB.tf2.setText("255");//initialise
une zone de texte à une valeur non nulle
mise_a_jour(panRGB);}
//initialisation globale
avec le vert maximum
public
void paint(Graphics g)
{ g.setFont(bold); //fonte
pour l'applet
g.setColor(c2);
//couleur du pinceau
g.fillRect(50,100,350,80);
g.setColor(c1);
//couleur d'écriture
g.drawString("Dans
l'applet",160,150);
g.setColor(Color.black);
g.drawRect(50,100,350,80);}
void
mise_a_jour(Panneau pan) //argument
= Panneau modifié
{ int
v1 = Integer.parseInt(pan.tf1.getText());
/*conversion
chaîne vers entier avec contrôle des valeurs
l'entrée d'une valeur non entière
provoque une exception*/
if
(pan==panRGB){
if ((v1<0) || (v1>255)){ //contrôle
de validité 0-255
v1=128;
pan.tf1.setText("128");}}
else
if
((v1<0) || (v1>360)){//contrôle
de validité 0-360
v1=0;
pan.tf1.setText("0");}
int v2 = Integer.parseInt(pan.tf2.getText());
if
(pan==panRGB){
if ((v2<0) || (v2>255)){//contrôle
de validité 0-255
v2=128;
pan.tf2.setText("128");}}
else
if
((v2<0) || (v2>100)){//contrôle
de validité 0-100
v2=50;
pan.tf2.setText("50");}
int v3 = Integer.parseInt(pan.tf3.getText());
if
(pan==panRGB){
if ((v3<0) || (v3>255)){
v3=128;
pan.tf3.setText("128");}}
else
if
((v3<0) || (v3>100)){
v3=50; pan.tf3.setText("50");}
//Modification
RVB
if
(pan==panRGB)
{ c1
= new Color(v1,v2,v3); //définition
de la couleur en RVB
float[]
hsb = Color.RGBtoHSB(v1,v2,v3,(new float[3])); //conversion
en HSB
hsb[0]
*= 360; hsb[1] *= 100; hsb[2] *= 100; //conversion
dans les gammes choisies
panHSB.tf1.setText(String.valueOf((int)hsb[0]));
//mise
à jour affichage dans les zones de texte du panneau RVB
panHSB.tf2.setText(String.valueOf((int)hsb[1]));
panHSB.tf3.setText(String.valueOf((int)hsb[2]));}
else
//modification
du panneau HSB
{
c1 = Color.getHSBColor((float)v1/360,(float)v2/100,(float)v3/100);
//conversion
des valeurs entre 0.0f et 1.0f
panRGB.tf1.setText(String.valueOf(c1.getRed()));
//mise
à jour affichage de l'autre panneau
panRGB.tf2.setText(String.valueOf(c1.getGreen()));
panRGB.tf3.setText(String.valueOf(c1.getBlue()));}
int
r=255-c1.getRed(); //couleur
complémentaire
int
v=255-c1.getGreen();
int b=255-c1.getBlue();
c2=new
Color(r,v,b);
canv.setBackground(c1); canv.col=c2;
//variables du Cadre
canv.repaint();
//mise à jour du Cadre
repaint();}
//mise
à jour de l'applet
}
//***********************************************
class
Panneau extends Panel
{ ColorTest applet; //variables
de la classe panel
TextField
tf1,tf2,tf3;
Panneau(ColorTest
app,String S1,String S2, String S3)//constructeur
{ applet
= app;
setLayout(new GridLayout(3,2,10,10)); //grille
2 colonnes de 3 lignes
tf1
= new TextField("0"); //création
des zones de texte
tf2
= new TextField("0");
tf3 = new TextField("0");
add(new
Label(S1,Label.LEFT));
//création
des labels avec les paramètres du constructeur
add(tf1);
add(new
Label(S2,0)); add(tf2);
add(new Label(S3,0)); add(tf3);}
public
boolean action(Event evt, Object arg)
{ if (evt.target instanceof TextField){
applet.mise_a_jour(this);
//appel d'une méthode
de l'applet
return
true;}
else return false;}
}
//***********************************************
class
Cadre extends Canvas
{ Color col;
public
void paint(Graphics g) //surcharge
de la méthode
{ g.setColor(Color.black);
g.drawRect(0,0,size().width-1,size().height-1);
g.setColor(col);
g.drawString("Canevas",10,20);}
}