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

            }

}   }   }