/** UneBoule.java tracé d'une boule, et rafraichissement la boule, tracée en rouge et noir, tourne quand on appuie sur un bouton; elle s'adapte à la taille de la fenêtre. définition des interfaces WindowListener et ActionListener fermeture de la fenêtre par l'encadrement ou par un bouton; le traitement est le même pour les deux types d'événements (WindowEvent ou ActionEvent): il y a surveillance de le fermeture de la fenêtre (cf. fermer()). Une fenêtre, deux boutons et une boule dessinée dans la fenêtre. Un bouton permet de fermer la fenêtre (fermeture surveillée), et un autre permet de 'faire tourner' la boule. Remarquer qu'il n'y a qu'une méthode actionPerformed dans laquelle on détecte la source de l'événement, donc le bouton qui a été utilisé. Le rafraichissement est pris en compte par redéfinition de la méthode: paint(Graphics). */ import java.awt.*; import java.awt.event.*; /** Une fenêtre est créée avec deux boutons: un pour tracer et un pour quitter. Cette fenêtre est sensible aux événements WindowEvent, et ActionEvent; dans cette clasee sont définies les réflexes à ces événements. Un cercle est tracé. */ public class UneBoule extends Frame implements WindowListener, ActionListener { // Un gestionnaire de géométrie, une barre et deux boutons BorderLayout gg = new BorderLayout(); Panel barre = new Panel(); ; Button clic = new Button("clic"); Button quit = new Button("quitter"); // Un entier pour surveiller la fermeture effective de la fenêtre int n_d_fermer; // Pour tracer la boule on trace des segments entre des points situés // sur la circonférence de la boule. // On mémorise les coordonnées dans 2 tableaux. final int nbp=16; // nombre de points pour la boule final double rot=2*Math.PI/(5*nbp); // angle de rotation double teta0; // angle initial double ptsX[], ptsY[]; /** Création d'une fenêtre contenant un bouton; quand on ferme cette fenêtre le programme est terminé. */ public UneBoule() { this.setLayout(gg); setTitle("Une fenêtre de 400x300; coin haut gauche:100x100"); // Panneau supérieur contient 2 boutons this.add(barre,"North"); barre.add(clic); barre.add(quit); // Sensibilité aux événements addWindowListener(this); clic.addActionListener(this); quit.addActionListener(this); // Les points sur la circonférence de la boule teta0=0; ptsX = new double[nbp]; ptsY = new double[nbp]; tournerPts(); n_d_fermer=0; } /** Fait tourner les points sur la circonférence de la boule (calcul des nouvelles coordonnées). */ public void tournerPts() { int i,j; double teta, pas=2*Math.PI/nbp;; teta0 += rot; if(teta0 > pas+0.00001) teta0 = rot; for( i=0, teta=teta0; i<nbp; i++, teta+=pas) { ptsX[i] = Math.cos(teta); ptsY[i] = Math.sin(teta); // if(i<5) System.out.println( "x:"+ptsX[i]+" y:"+ptsY[i] // + " teta:"+teta); } } /** Trace la boule dans la fenêtre: la circonférence et des cordes entre les points de la circonférence. */ public void tracerBoule(Graphics cg) { Dimension dim = this.getSize(); Point p=barre.getLocation(); int haut=barre.getSize().height, mY=p.y, mX=p.x; int r = Math.min(dim.height-haut-2*mY,dim.width-2*mX)/2; int xc=mX+r, yc=mY+haut+r, x1,y1, i,j; System.out.println( "tracerBoule() "+xc+','+yc+", "+r+", " + cg.getColor()); cg.clearRect(xc-r,yc-r,2*r,2*r); cg.setColor(Color.black); cg.drawOval(xc-r,yc-r,2*r,2*r); cg.drawOval(xc-r-1,yc-r-1,2*r+2,2*r+2); cg.setColor(Color.red); for( i=0; i<nbp; i++) { x1 = xc+(int)(r*ptsX[i]); y1=yc+(int)(r*ptsY[i]); for(j =i+1; j<nbp; j+=2) { cg.drawLine( x1, y1, xc+(int)(r*ptsX[j]), yc+(int)(r*ptsY[j])); } } } /** Pour surveiller la fermeture de la fenêtre. Ici de façon élémentaire on gére le compteur n_d_fermer; quand il vaut 2, on termine l'application. */ private void fermer( String ch ) { n_d_fermer++; if( n_d_fermer==2) System.exit(0); else { System.out.println( ch + " essai " + n_d_fermer); } } // Les différents réflexes /** Gestion du re-affichage */ public void paint(Graphics cg) { System.out.println( "Méthode: paint() "); tracerBoule(cg); } /** Gestion des WindowEvent */ public void windowClosing( WindowEvent ev ) { Point p = ev.getComponent().getLocation(); System.out.println("Position: " + p.x + ", " + p.y); fermer(ev.toString()); } public void windowActivated( WindowEvent e ) { } public void windowClosed( WindowEvent e ) { } public void windowDeactivated( WindowEvent e ) { } public void windowDeiconified( WindowEvent e ) { } public void windowIconified( WindowEvent e ) { } public void windowOpened( WindowEvent ev ) { Point p = new Point(ev.getComponent().getLocation()); System.out.println("WindowOpened() "+ev.toString()); System.out.println(" Position: " + p.x + ", " + p.y); System.out.println(" visible:" + this.isVisible()); } /** Gestion des événements ActionEvent */ public void actionPerformed( ActionEvent ev) { Button b = (Button) ev.getSource(); Container p1 = b.getParent(); Container p2 = p1.getParent(); System.out.println( "source: " + b.getLabel() + " parent: " + p1.getClass()); if( b == clic) { tournerPts(); tracerBoule(p2.getGraphics()); } else fermer( ev.toString() ); } //Construire l'application public static void main(String[] args) { UneBoule fen = new UneBoule(); fen.setSize(new Dimension(400, 300)); fen.setLocation(400,100); fen.validate(); fen.setVisible(true); } } // fin class UneBoule