ublicrivateackagemportxtendsbstract
Planche 1
Inf 431 -- Cours 8
Programmation par objets


Librairies graphiques
http://jeanjacqueslevy.net
secrétariat de l'enseignement:
Catherine Bensoussan
cb@lix.polytechnique.fr
Aile 00, LIX,
01 69 33 34 67
http://www.enseignement.polytechnique.fr/informatique/IF

Planche 2

Plan


.6@percent
  1. Sous-typage et héritage
  2. Héritage et Surcharge
  3. Classes abstraites et interfaces de Java

  4. Initialisation des classes
  5. Racine de la hiérarchie des classes
  6. Réflexivité
  7. Polymorphisme en Java

  8. Interfaces graphiques
  9. Entrée graphique
  10. Exemples d'utilisation d'AWT

Planche 3

Sous-classes « sous-typage (1/2)

Planche 4

Sous-classes « sous-typage (2/2)

Exercice 1 Donner la loi de sous-typage pour les tableaux.

Théorie plus compliquée en présence de polymorphisme ou de méthodes binaires
Þ sous-classe ne correspond plus à la notion de sous-typage.
Þ Ocaml, GJ (Generic Java = Java 1.5), Generic C#

La théorie des types est introduite dans le cours Principes des Langages de Programmation de Majeure 1. Cf. livre de Benjamin Pierce ou de Abadi-Cardelli.


Planche 5

Notation objet et héritage

C est une classe et o un objet de cette classe (o : C)

  statique dynamique
variable C.x o.x
fonction C.f() o.f()

En terminologie objet, fonction = méthode.

Exemples quand on déclare
String s,t; et Point p;
function System.in p.x
  Point.rotation(p) s.equals(t)
Exercice 2 Expliquer la notation System.out.println.

Planche 6

Héritage et surcharge (1/3)

Exercice 3 Quelle est la valeur imprimée par le programme suivant?

class C {
  void f() { g(); }
  void g() { System.out.println(1); }
} }

class D extends C {
  void g() { System.out.println(2); }

  public static void main (String[ ] args) {
    D x = new D();
    x.f();
} } Exécution

Planche 7

Héritage et surcharge (2/3)

Exercice 4 Quel est le résultat produit par le programme suivant quand T,T' Î {A, B} et U,U' Î {A, B} avec T' <: T et U' <: U ?
  public static void main (String[ ] args) {
    T x = new T'(); U y = new U'();
    System.out.println (x.f(y));
  }

  int f (A y) {return 1; }
}

class B extends A {
  int f (B y) {return 2; }
}  Exécution

Planche 8

Héritage et surcharge (3/3)

Planche 9

Classes abstraites -- Interfaces (1/2)

mplements
Planche 10

Classes abstraites -- Interfaces (2/2)


public interface Couleur {
  final int ROUGE = 0, JAUNE = 1;
}

interface PointCirculaire {
  void static rotation (Point pdouble theta);
}

interface PointMobile {
  void static translation (Point pdouble dx, double dy);
}

class Point implements PointCirculaire, PointMobile {
  ...
}

Exercice 5 Quel type utilise-t-on pour référencer les objets d'une classe implémentant un interface?

Exercice 6 Même question à l'intérieur de la classe implémentant l'interface?


Planche 11

Initialisation des classes

Le mot-clé static suivi d'un bloc d'instructions permet de faire une initialisation de la classe à son chargement (lors du premier accès à un de ses champs).
class Point {
  double x, y;
  static void translation (Point pdouble dx, double dy) {
    p.x = p.x + dx; p.y = p.y + dy;
  }

  static Point rotation (Point pdouble theta) {
    double x = p.x * Math.cos(theta) - p.y * Math.sin(theta);
    double y = p.x * Math.sin(theta) + p.y * Math.cos(theta);
    return new Point(x, y);
  }

  static {
    System.out.println ("La classe Point vient d'être chargée");
  }
}

Planche 12

Racine de la hiérarchie des classes



Object est la classe la plus générale:
" C C <: Object
(C est une classe ou un tableau quelconque).
Planche 13

Réflexivité

Planche 14

Polymorphisme (1/3)

Pas de polymorphisme en Java (avant 1.5). Pour l'approximer, on peut tenter de se servir de la classe Object.
class Liste {
  Object valeur; Liste suivant;

  static int length (Liste x) {
    if (x == nullreturn 0;
    else return 1 + length (x.suivant);
  }

  static Liste append (Liste x, Liste y) {
    if (x == nullreturn y;
    else return new Liste(x.valeur, append(x.suivant, y));
  }
}

Marche pour length, mais pas pour append où on doit faire des conversions explicites.

Planche 15

Polymorphisme (2/3)

ou en style orienté-objet.
abstract class Liste {
  abstract int length () ;
  abstract Liste append (Liste y);
}

class Nil extends Liste {
  int length () { return 0; }
  Liste append (Liste y) { return y; }
}

class Cons extends Liste {
  Object valeur; Liste suivant;

  static int length () { return 1 + suivant.length(); }
  static Liste append (Liste y) {
    return new Cons(valeur, suivant.append(y));
  }
}

Exercice 7 Comment calculer la longueur d'une liste d'entiers à partir de la fonction précédente.


Planche 16

Polymorphisme (3/3)

Planche 17

Procédural ou Objets?


(bis)
Planche 18

Paquetages et Classes graphiques

On utilisera (au choix) 3 bibliothèques graphiques:
Planche 19

MacLib (1/2)

Initialement compatible avec QuickDraw du MacInstosh.
class Lissajoux {
  static final double X0 = 100, Y0 = 100, K = 80, A = 3, B = 2, D = 0.9;

  static int X(double t) { return (int) (X0 + K*Math.cos(A*t)); }
  static int Y(double t) { return (int) (Y0 + K*Math.sin(B*t+D)); }

  public static void main(String[ ] args) {
    final int N = 120;
    double t = 0;
    MacLib.initQuickDraw(); // initialisation du graphique
    MacLib.moveTo(X(0), Y(0));
    for (int i = 0; i < N; ++i) {
      t = t + 2 * Math.PI/N;
      MacLib.lineTo(X(t), Y(t));
} } }  Exécution

Merci à Philippe Chassignet (LIX).

Planche 20

MacLib (2/2)

Ou avec la notation objets:
class Lissajoux {
  static final double X0 = 100, Y0 = 100, K = 80, A = 3, B = 2, D = 0.9;

  static int X(double t) { return (int) (X0 + K*Math.cos(A*t)); }
  static int Y(double t) { return (int) (Y0 + K*Math.sin(B*t+D)); }

  public static void main(String[ ] args) {
    final int N = 120;
    double t = 0;
    GrafPort g = new GrafPort("mon dessin");
    g.moveTo(X(0), Y(0));
    for (int i = 0; i < N; ++i) {
      t = t + 2 * Math.PI/N;
      g.lineTo(X(t), Y(t));
} } }

Permet d'avoir plusieurs GrafPort.

Planche 21

Entrée graphique (1/3)



Front descendant
(ne pas oublier d'attendre le front montant)
Front montant (plus sûr)
 
for(;;) {
    while (!g.button())
        ;
    Point p = g.getMouse ();
    while (g.button())
        ;
    action (p.h, p.v);
}
for (;;) {
    while (!g.button())
        ;
    while (g.button())
        ;
    Point p = g.getMouse ();
    action (p.h, p.v);
}

Attente active (busy wait).

Planche 22

Entrée graphique (2/3)

Planche 23

Entrée graphique (3/3)

Planche 24

Librairie AWT

Un interface utilisateur graphique (GUI) est formé de:
Planche 25


awt


Planche 26

Fenêtre graphique


import java.awt.*;
class Frame1 {
  public static void main (String[ ] args) {
    Frame f = new Frame ("Bonjour");
    f.add ("Center"new Label ("Bonjour les élèves!", Label.CENTER));
    f.setSize (300, 100);
    f.setVisible(true);
} }            Exécution

ou en programmation par objets:
class Frame2 extends Frame {
  Frame2 (String s) {
    super(s);
    add ("Center"new Label ("Bonjour les élèves!", Label.CENTER));
    setSize (300, 400);
    setVisible(true);
  }
  public static void main (String[ ] args) {
    Frame2 f = new Frame2 ("Bonjour");
} }            Exécution

Planche 27

Contexte graphique

class Frame3 extends Frame {
  Frame3 (String s) {
    super(s);
    add ("North"new Label ("Bonjour les élèves!", Label.CENTER));
    setSize (300, 400);
    setVisible(true);
  }

  public static void main (String[ ] args) {
    Frame3 f = new Frame3 ("Frame2");
  }

  public void paint (Graphics g) {
    int w = getSize().width;
    int h = getSize().height;
    int x = w/2; int y = h/2;
    g.setColor(Color.red);
    g.fillRect(x-w/4, y-w/4, w/4, w/2);
    g.setColor(Color.yellow);
    g.fillRect(x, y-w/4, w/4, w/2);
  }
}          Exécution

Les méthodes paint et repaint affichent les composants.

Planche 28

Un bouton avec interaction


import java.awt.*;
import java.awt.event.*;

public class Frame4 extends Frame {
  Button q = new Button ("Quit");

  public Frame4 (String title) {
    super (title);
    setLayout (new FlowLayout());
    add(q);
    setSize (300, 100);
    q.addActionListener (new Quit());
    setVisible(true);
  }

  public static void main (String[ ] args) {
    Frame4 f = new Frame4 (args[0]);
} }

class Quit implements ActionListener {
  public void actionPerformed (ActionEvent e) {
    System.exit(0);
} }           Exécution

Planche 29

Deux boutons et un texte


public class Frame5 extends Frame {
  Button q = new Button ("Quit");
  Button a = new Button ("A");
  TextField t = new TextField (20);

  public  Frame5 (String title) {
    super (title); setLayout (new FlowLayout());
    add(q); add(a); add(t);
    setSize (300, 100);
    q.addActionListener (new Quit());
    a.addActionListener (new ActionA(t, "Bouton a!"));
    setVisible(true);
  }
  ...
} }

class ActionA implements ActionListener {
  TextField t; String s;
  ActionA (TextField t0, String s0) { t = t0; s = s0;  }

  public void actionPerformed (ActionEvent e) {
    t.setText(s);
} }          Exécution

Planche 30

Une interaction à la souris


public class Frame6 extends Frame {
  public Frame6 (String title) {
    super (title);
    setLayout (new FlowLayout());
    add(q); add(a); add(t);
    validate();
    pack();
    addMouseListener (new ActionB(t, "Bouton relache'."));
    q.addActionListener (new Quit());
    a.addActionListener (new ActionA(t, "Bouton a!"));
    setVisible(true);
  }
  ...
}

class ActionB extends MouseAdapter {
  TextField t; String s;
  ActionB (TextField t0, String s0) {t = t0; s = s0; }

  public void mouseReleased (MouseEvent e) {
    t.setText(s);
  }    Exécution

Planche 31

Evénements souris

Exercice 8 Programmer un petit interface utilisateur où on imprime les coordonnées du point courant sur un clic souris.

Exercice 9 Programmer un petit interface utilisateur qui dessine un vecteur entre deux points rentrés à la souris.





This document was translated from LATEX by HEVEA.