1. Par manque de temps, voici seulement la classe solution. D'abord le bouton pour quitter, classe Quit.
    import java.awt.* ;
    import java.awt.event.* ;

    class QuitButton extends Button {
      
    QuitButton () {
        
    super("quit") ;
        addActionListener
          (
    new ActionListener () {
            
    public void actionPerformed (ActionEvent e) {
              System.err.println("Adios") ;
              System.exit(0) ;
            } ;
          }) ;
      }
    }

      
    /*
    class Quit implements ActionListener {

      public void actionPerformed (ActionEvent e) {
        System.exit(0) ;
      }
    }
      */
    On note l'utlisation d'une inner class anonyme à la place d'une classe Quit, donnée en commentaire.

  2. Voici la code solution, classe GraphicCounter.
    import java.awt.* ;
    import java.awt.event.*;

    class GraphicCounter extends Panel {
      
    Button plus = new Button("+") ;
      
    Button moins = new Button("-") ;
      
    Label lab = new Label(" "Label.CENTER) ;
      
    Counter c ;
      
    GraphicCounter (Counter c) {
        
    super() ;
        
    this.c = c ;
        add(plus) ; plus.addActionListener(
    new Plus(this)) ;
        add(lab) ; lab.setText(c.toString()) ;
        add(moins) ; moins.addActionListener(
    new Moins(this)) ;
      }

      
    ActionListener listener ;

      
    public void addActionListener(ActionListener listener) {
        
    this.listener = listener ;
      }

       
    public static void main (String[ ] args) {
         
    GraphicCounter c = new GraphicCounter(new Counter (0)) ;
         
    Frame f = new Frame("Counter") ;
         f.add("North", c) ;
         f.add("South"
    new QuitButton ()) ;
         f.setSize(150,75) ;
         f.setLocation(100,100) ;
         f.show() ;
       }
    }

    abstract class Op implements ActionListener {
      
    GraphicCounter gc ;

      
    Op (GraphicCounter gc) {
        
    this.gc = gc ;
      }

      
    abstract void op() ;

      
    public void actionPerformed (ActionEvent e) {
        op() ;
        gc.lab.setText(gc.c.toString()) ;
        
    if (gc.listener != null)
          gc.listener.actionPerformed(e) ;
      }

    }

    class Plus extends Op {

      
    Plus (GraphicCounter gc) { super(gc) ; }

      
    void op() { gc.c.incr() ; }
    }

    class Moins extends Op {
       
    Moins (GraphicCounter gc) { super(gc) ; }

      
    void op() { gc.c.decr() ; }
    }
    On note que les constructeurs des espions prennent l'objet GraphicCounter en argument, en effet, ces espions ont besoin d'intervenir sur certains champs, essentiellement sur le Counter c et sur le Label lab. Il faut noter l'usage de this dans l'appel de ces constructeurs.

    Ne vous occupez pas du champ listener et de la méthode addActionListener, c'est pour le prochain exercice.

  3. (et 4) La méthode main de GraphicCounter répond aux questions.