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);}
}