page précédantetable des matièrespage suivante
 

AWT et Swing

L'Abstract Windowing Toolkit (AWT), fournit un grand nombre de classes pour construire un GUI en Java. Avec AWT on peut créer des fenêtres, dessiner, manipuler des images et utiliser des composants comme des boutons, des barres de défilement et des menus déroulants. Les classes qui composent l'AWT font partie du paquetage java.awt.

L'AWT est divisé en deux parties – une sur l'interface qui fournit des boutons, des cases à cocher, des zones de saisie de texte et d'autres composants, et une autre qui gère le dessin et l'affichage d'images.

L'AWT est une abstraction. Les applications fonctionnent de la même façon sur toutes les plat-formes. L'AWT utilise des toolkits interchangeables qui appelle le système de fenêtrage de la machine pour protéger le code d'une application des détails de l'implémentation.

Concepts de base

composant – objet fondamentale de l'interface utilisateur Java; tout ce qui est affiché sur l'écran

fenêtres, zones de dessin, boutons, cases à cocher, barres de défilement …

Chaque composant a des attributs comme la visibilité, taille, position, couleur.

Les actions effectués par l'utilisateur envoient des événements au composant en appelant ses méthodes de gestion des événements.

conteneur – groupe les composants, les dispose pour l'affichage et les associe avec un périphérique particulier.

Pour être utilisé un composant doit être inséré dans un conteneur.

Chaque conteneur représente une espèce du composant.

Les composants délèguent certaines responsabilités au conteneurs dans les quels ils résident. Au lieu de gérer un événement le composant peut le transmettre à son conteneur. Le composant est informé pour les opérations qui affectent d'autres composants – change de la taille, visibilité … Le conteneur a information s'il a besoin d'être redessiné.
 
 




Swing

 

Component                                                                        AWT

      Label                                                                             AWT

      Container                                                                     AWT

             JComponent

                   JLabel

                   JComboBox

                   AbstractButton

                         JButton

                         JToggleButton

                                JCheckBox

                                JRadioButton

                   JMenuItem

                         JMenu

                         JCheckBoxMenuItem

                   JMenuBar

                   JPanel

                   JToolBar

                   JScrollPane

                   JTabbedPane

                   JSplitPane

                   JTextComponent

                         JTextField

                         JTextArea

                         JEditorPane

                   JList

                   JTree

                   JTable

             Window                                                                  AWT

                   Frame                                                               AWT

                         JFrame

                   Dialog                                                              AWT

                         JDialog

                   Jwindow


  JFrame

import javax.swing.* ;
public class Window1 {
         public static void main (String args[]){
                JFrame wd = new JFrame() ;
                wd.setSize (250, 100) ;
                wd.setTitle ("graphic window") ;
                wd.setVisible (true) ;
         }
}


wd.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
wd.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);                        // default)
wd.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
wd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

import java.awt.event.*;
import javax.swing.* ;
public class Window1 {
         public static void main (String args[]){
                JFrame wd = new JFrame() ;
                wd.setSize (250, 100) ;
                wd.setTitle ("graphic window") ;
                wd.setVisible (true) ;
                wd.addWindowListener(new WndCls());
         }
         // To close the graphic thread:
         static class WndCls extends WindowAdapter {
                public void windowClosing(WindowEvent e) {
                      System.exit(0);
                }
         }
}

import javax.swing.* ;
public class Window1 {
         public static void main (String args[]){
                JFrame wd = new JFrame() ;
                wd.setSize (250, 100) ;
                wd.setTitle ("graphic window") ;
                wd.setVisible (true) ;
                wd.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         }   
}


Modifications de JFrame

import javax.swing.* ;
public class MyFrame extends JFrame{
         MyFrame(int x, int y, int ln, int ht){
                this.setBounds(x, y, ln, ht);
                this.setVisible(true);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         }
}

import java.util.*;
public class Test1 {
         public static void main(String arg[]){
                MyFrame mf = new MyFrame(50,80,200,150);
                mf.setSize (250, 100) ;
                mf.setTitle ("graphic window") ;
                mf.setVisible (true) ;
                Scanner in = new Scanner(System.in);
                System.out.print("new name: ");
                String s = in.nextLine();
                mf.setTitle (s);
                System.out.println("boundaries modified ");
                mf.setBounds(60,45,200,120);      //x, y of the upper left corner, length, height
                System.out.print("new length ");
                int ln= Integer.parseInt(in.nextLine());
                System.out.print("new height ");
                int height= Integer.parseInt(in.nextLine());
                mf.setSize (ln,height);
                System.out.print("enter to make invisible:");
                in.nextLine();
                mf.setVisible(false);
                System.out.print("enter to make visible:");
                in.nextLine();
                mf.setVisible(true);
                System.out.print("enter to finish program");
                in.nextLine();
                System.exit(1);
         }
}

Souris  dans un JFrame

class MyMouse implements MouseListener {
         public void mouseClicked (MouseEvent ev) { ..... }
         public void mousePressed (MouseEvent ev) { ..... }
         public void mouseReleased(MouseEvent ev) { ..... }
         public void mouseEntered (MouseEvent ev) { ..... }
         public void mouseExited (MouseEvent ev) { ..... }

}

----------------

import java.awt.event.*;
import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(int x, int y, int ln, int ht){
        this.setBounds(x, y, ln, ht);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addMouseListener(new MyMouse()); 
    }
    public class MyMouse implements MouseListener{
        public void mouseClicked(MouseEvent ev) {
            System.out.println("x="+ev.getX() +   " y="+ ev.getY());
        }
        public void mousePressed (MouseEvent ev) {}
        public void mouseReleased(MouseEvent ev) {}
        public void mouseEntered (MouseEvent ev) {
            System.out.println("mouse in");
        }
        public void mouseExited (MouseEvent ev) {
            System.out.println("mouse out");
        }
    }
}


public class Test {
         public static void main(String arg[]){
                MyFrame mf = new MyFrame(50,80,200,150);
         }
}

Adapter

class MouseAdapter implements MouseListener {
         public void mouseClicked (MouseEvent ev) {}
         public void mousePressed (MouseEvent ev) {}
         public void mouseReleased(MouseEvent ev) {}
         public void mouseEntered (MouseEvent ev) {}
         public void mouseExited (MouseEvent ev) {}
}

--------------------

public class MyMouse extends MouseAdapter {
         public void mouseClicked(MouseEvent ev) {
                System.out.println("x="+ev.getX() + " y="+ ev.getY());
         }
         public void mouseEntered (MouseEvent ev) {
                System.out.println("mouse in");
         }
         public void mouseExited (MouseEvent ev) {
                System.out.println("mouse out");
         }
}




pAwt001
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.* ;
public class Ex {
static JFrame f;
public static void main(String [] args) {
f = new JFrame("Frame 1");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MenuItem mi1 = new MenuItem("add a menu");
MenuItem mi2 = new MenuItem("remove added menu");
Menu m = new Menu("Menu 1");
m.add(mi1);
m.add(mi2);
mi1.addActionListener(new Mi1());
mi2.addActionListener(new Mi2());
MenuBar mb = new MenuBar();
mb.add(m);
f.setSize(300, 250);
f.setMenuBar(mb);
f.setVisible(true);
}
static class Mi1 implements ActionListener{
public void actionPerformed(ActionEvent e) {
f.getMenuBar().add(new Menu("Menu added"));
}

}
static class Mi2 implements ActionListener{
public void actionPerformed(ActionEvent e) {
int len = f.getMenuBar().getMenuCount();
if(len>1){
Menu m=f.getMenuBar().getMenu(len-1);
f.getMenuBar().remove(m);
}
}

}
}


pAwt002
import java.awt.*;
import javax.swing.* ;
public class Ex1 {
    public static void main (String[] arg){
        JFrame f = new JFrame("Frame 1");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Panel p = new Panel();
        Button b1 = new Button("bt 1");
        Checkbox cb = new Checkbox("check please",true);
        p.add(b1);
        p.add(cb);
        f.add(p);
        f.setSize(300, 220);
        f.setVisible(true);
    }
}

import java.awt.*;
import javax.swing.* ;
public class Ex1 {
    public static void main (String[] arg){
        JFrame f = new JFrame("Frame 1");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new FlowLayout());
        Panel p = new Panel();
        Button b1 = new Button("bt 1");
        Checkbox cb = new Checkbox("check please",true);
        p.add(b1);
        p.add(cb);
        f.add(p);
        Panel p2 = new Panel();
        for(int i=0;i<5;i++){
            p2.add(new Button("pan2_Bt"+i));
        }
        f.add(p2);

        f.setSize(450, 250);
        f.setVisible(true);
    }
}






Applets

La classe Applet est dérivée de la classe Panel. Un objet Applet est fondamentalement un objet Panel plus une position. Il s'attend à être inclus dans un document dans un environnement de visualisation qui fournisse ses propres ressources.

Pour construire un objet Applet on construit une classe derivée de la classe Applet et qui surdefinit ses méthodes. Les plus importantes sont les méthodes qui sont contrôlé par le "browser":
 
Méthode Opération
init() appelé lors de la création de l'applet. L'applet utilise toujours le constructeur par défaut de la classe Applet et toutes les initialisations spéciales sont mis dans ce méthode.
start() appelé chaque fois quand l'applet entre dans la fenêtre de la visibilité du "browser" pour démarrer sont activité normale (arrêté par stop()). Appelé aussi après init().
paint() Méthode de la classe de base "Component" pour dessiner l'applet. Cette méthode et appelés chaque fois par la méthode update() quand un objet "Component" a décidé qu'il a besoin d'être redessiné. 
stop() appelé

La méthode paint() a comme paramètre une référence a objet Graphics, qui représente la surface sur la quelle on peut dessiner. Pour les applets cette surface est l'espace définie dans l'applet par la balise applet.

        <applet code = nom.class width=300 height=200 > </applet>

 La méthode paint()  est appelée chaque fois quand on a besoin de redessiner l'applet. On n'a pas besoin de la redéfinir mais c'est la façon la plus facile de créer une applet simple. 

Normalement quand on surcharge une méthode on doit appeler la méthode de la classe de base s'il fait des actions importants. Mes les méthodes init(), stop() et start() de la classe Applet ne font rien, donc on n'a pas besoin de les appeler.

Pour afficher un composant il faut faire deux chose:

Chaque composant est redessiné automatiquement par la méthode update(), donc sa construction  doit être faite dans init() et non dans paint().

La gestion des événements en AWI de Java 1.0 et basé sur la redéfinition de la méthode action(). Afin de savoir de quel objet s'agit il on doit introduire une cascade de if instruction dans la redéfinition et a la fin d'appeler la méthode prédefinit.

AWT de Java 1.1 a introduit des changes dramatique dans la gestion des événements. Chaque composant peut initier (allumer) un événement. Chaque type d'événement est représenter par une classe différente. Quand un événement est allumé, il est reçu par un ou plusieurs auditeurs, qui réagissent à cette événement.

Tous les auditeurs sont des objets d'une classe qui implémente un type d'interface auditeur. Pour gérer un événement il faut qu'on crée un objet auditeur et qu'on le lie (enregistre) avec le composant qui allume cet événement.

La registration se fait par la méthode addXXXListener(), dont XXX représente le type d'événement.
 

 
//: Bouton.java
// gestion de la pression d'un  bouton
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Bouton extends Applet {
   Button  b1, b2;
   TextField  t = new TextField(" texte au debut",20);
   public void init() {
          b1 = new Button("Bouton 1");
         
b2 = new Button("Bouton 2");
          b1.addActionListener(new B1());
          b2.addActionListener(new B2());
          add(b1);
          add(b2);
          add(t);
  }

  class B1 implements ActionListener {
          public void actionPerformed(ActionEvent e) {
                  t.setText("Bouton 1");
          }
  }
  class B2 implements ActionListener {
          public void actionPerformed(ActionEvent e) {
                   t.setText("Bouton 2");
          }
  }

}

 

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

public class Bt1 extends Applet {
   Button  b1, b2;
   B1 bls1 = new B1();
   B2 bls2 = new B2();
   B11 bls11 = new B11();
   TextField  t = new TextField("Click Bt1 to hide Bt2",20);
   boolean showBt2=true;
   public void init() {
          b1 = new Button("Bt1");
          b2 = new Button("Bt2");
          b1.addActionListener(bls11);
          b2.addActionListener(bls2);
          b1.addActionListener(bls1);
          add(b1);
          add(b2);
          add(t);
  }

  class B1 implements ActionListener {
          public void actionPerformed(ActionEvent e) {
              if(showBt2){
                  t.setText("Click Bt1 to hide Bt2");
              }else{
                  t.setText("Click Bt1 to show Bt2");
              }               
          }
  }
  class B2 implements ActionListener {
          public void actionPerformed(ActionEvent e) {
                   t.setText("Bt2 is clicked ");
          }
  }
  class B11 implements ActionListener {
      public void actionPerformed(ActionEvent e) {
          if(showBt2){
              remove(b2);               showBt2=false;
          }
          else {
              add(b2);               showBt2=true;
          }
      }
  }
}

  Exemple avec TextField:

 

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class TextFieldTest extends Applet{
    TextField t;
    public void init(){
        t=new TextField("",10);
        t.addActionListener(new T());
        add(t);
        t.setEchoChar('*');
    }
    class T implements ActionListener{
        public void actionPerformed(ActionEvent e){          
            if(t.getEchoChar()=='*')
                t.setEchoChar((char)0);
            else
                t.setEchoChar('*');
        }
    }
}

 

Quelques événement et auditeurs correspondants

Actions qui donnent un événement  Type auditeurs
"clicks" d'un bouton, "Enter" dans un champs de texte, ou bien choix
d'un
"menu item"
ActionListener
fermeture d'un  "frame" (main window) WindowListener
"clicks" d'un bouton de souris quand le "cursor" se trouve
sur un composant
MouseListener
déplacement de souris sur un composant MouseMotionListener
composant devient visible ComponentListener
composant entre dans la distance focale  du clavier FocusListener
"list" selection changement ListSelectionListener
changement dans les caractéristiques (comme texte ou bien "label")
du composant
 
PropertyChangeListener

Le même applet en utilisant AWT 1.0:
 

//: BoutonOld.java
// gestion de la pression d'un  bouton
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class BoutonOld extends Applet {
  Button  b1, b2;
  TextField  t = new TextField(" texte au debut",20);
  public void init() {
    b1 = new Button("Bouton 1");
   
b2 = new Button("Bouton 2");
   
add(b1);
    add(b2);
    add(t);
  }
  public boolean action(Event evt, Object arg) {
    if(evt.target.equals(b1))
       t.setText("Bouton 1");
   else if(evt.target.equals(b2))
       t.setText("Bouton 2");
   else          // Laisse la classe de base de le gérer:
     return super.action(evt, arg);
   return true;
  }
}

 

JFC et Swing
 

"Swing" était le nom d'un projet qui visait le développement de "Java Foundation Classes" (JFC).  JFC (très souvent nommé "Swing API") représente un groupe des classes pour construire  interfaces d'utilisateur graphiques (GUI) et qui ajoute une fonctionnalité graphique et interactive dans les applications et applets de Java.  Tous les classes se trouvent dans le paquetage  "javax.swing".

Component                                                             AWT
      Label                                                                 AWT
      Container                                                          AWT
             Panel                                                           AWT
                   Applet                                                  AWT
                         JApplet
             JComponent
                   JLabel
                   JComboBox
                   AbstractButton
                         JButton
                         JToggleButton
                                JCheckBox
                                JRadioButton
                   JMenuItem
                         JMenu
                         JCheckBoxMenuItem
                   JMenuBar
                   JPanel
                   JToolBar
                   JScrollPane
                   JTabbedPane
                   JSplitPane
                   JTextComponent
                         JTextField
                         JTextArea
                         JEditorPane
                   JList
                   JTree
                   JTable
             Window                                                    AWT
                   Frame                                                AWT
                         JFrame
                   Dialog                                                AWT
                         JDialog
                   Jwindow

API swing est basé sur AWT et on travaille avec de même façon que avec AWT. La différence c'est dans les noms de classes et dans la fonctionnalité plus riche qu'on trouve dans swing. On va refaire l'exemple dernier avec swing API:

 
//: BoutonSwing.java
// Swing - gestion de la pression d'un bouton
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;

public class BoutonSwing extends Applet {
   ImageIcon b1ButtonIcon;
   ImageIcon b2ButtonIcon;
   JButton b1,b2;
   TextField t = new TextField("un chat et un chien",20);
   public void init() {
      b1ButtonIcon = createImageIcon("images/catS.gif");
      b2ButtonIcon = createImageIcon("images/dogS.gif");
      b1 = new JButton("un chat", b1ButtonIcon);
      b2 = new JButton("un chien", b2ButtonIcon);
      b1.addActionListener(new B1());
      b2.addActionListener(new B2());
      add(b1);
      add(b2);
      add(t);
   }
   class B1 implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         t.setText("un chat");
      }
   }
   class B2 implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         t.setText("un chien");
      }
   }
   protected static ImageIcon createImageIcon(String path) {
      java.net.URL imgURL = BoutonSwing.class.getResource(path);
      if (imgURL != null) {
         return new ImageIcon(imgURL);
      } else {
         System.err.println("Couldn't find file: " + path);
         return null;
      }
   }
}

Quand on connaît les bases de AWT, passage vers swing API ne représente aucune problème

 

Applet et application à la fois 

Le programme suivant illustre une possibilité intéressante: d'avoir une classe qui pourrait être lancée soit comme application soit comme applet. Pour faire ça on doit ajouter une méthode  main() et de construire une instance Applet dans une frame.

//: BoutonD.java
// gestion de la pression d'un  bouton
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

import javax.swing.*;

public class Bt extends Applet {
    Button b1 = new Button("Bt 1"),b2 = new Button("Bt 2");
    TextField t = new TextField(" initial text",20);
    public void init() {
        b1.addActionListener(new B1());
        b2.addActionListener(new B2());
        add(b1);
        add(b2);
        add(t);
    }
    class B1 implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            t.setText("Bt 1");
        }
    }
    class B2 implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            t.setText("Bt 2");
        }
    }

    public static void main(String[] args) {     // A main() for the application:
        Bt applet = new Bt();
        JFrame aFrame = new JFrame("Bt");
        aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        aFrame.add(applet);
        aFrame.setSize(300,200);
        applet.init();
        applet.start();
        aFrame.setVisible(true);
    }
}

Exemple Frame, menu

import java.awt.*;
import java.awt.event.*;
public class Ex {
    static int w=300,h=250;
    static Frame f;
 public static void main(String [] args) {
   f = new Frame("Frame 1");
   Menu m = new Menu("Menu 1");
   Button b = new Button("inc 10%"),
          b2 =  new Button("dec 10%");
   MenuItem mi1 = new MenuItem("Increment 10%");
   MenuItem mi2 = new MenuItem("Decrement 10%"); 
   m.add(mi1);
   m.add(mi2);
   mi1.addActionListener(new Inc());
   mi2.addActionListener(new Dec());
   MenuBar mb = new MenuBar();
   mb.add(m);
   f.setLayout(new FlowLayout());
   f.add(b);
   f.add(b2);
   b.addActionListener(new Inc());
   b2.addActionListener(new Dec());
   f.setSize(w, h);
   f.setMenuBar(mb);
   f.addWindowListener(new WL());
   f.setVisible(true);
 }
 static class WL extends WindowAdapter {
     public void windowClosing(WindowEvent e) {
       System.exit(0);
     }
 }
 static class Inc implements ActionListener{
     public void actionPerformed(ActionEvent e) {
         w+=w/10;
         h+=h/10;
         f.setSize(w, h); 
     }
 }
 static class Dec implements ActionListener{
     public void actionPerformed(ActionEvent e) {
         w-=w/10;
         h-=h/10;
         f.setSize(w, h);   
     }
 }
}

 

Action sur les caractéristiques d’une fenêtre

import java.awt.event.*;
import javax.swing.* ;
public
 class MyFrame extends JFrame{
         MyFrame(int x, int y, int ln, int ht){
                this.setBounds(x, y, ln, ht);
                this.setVisible(true);
                this.addWindowListener(new WndCls());
                this. setTitle ("graphic window") ;
         }
         // To close the application:
          class WndCls extends WindowAdapter {
                public
 void windowClosing(WindowEvent e) {
                      dispose()
;
                }
         }
}
import java.util.*;
public
 class Test1 {
         public
 static void main(String arg[]){
                MyFrame mf = new MyFrame(50,80,200,150);
                mf.setSize (250, 100) ;
                mf.setTitle ("graphic window") ;
                mf.setVisible (true) ;
                Scanner in = new Scanner(System.in);
                System.out.print("new name: ");
                String
 s = in.nextLine();
                mf.setTitle (s);
                System.out.println("boundaries modified ");
                mf.setBounds(60,45,200,120);      //x, y of the upper left corner, length, height
                System.out.print("new length ");
                int ln= Integer.parseInt(in.nextLine());
                System.out.print("new height ");
                int height= Integer.parseInt(in.nextLine());
                mf.setSize (ln,height);
                System.out.print("enter to make invisible:");
                in.nextLine();
                mf.setVisible(false);
                System.out.print("enter to make visible:");
                in.nextLine();
                mf.setVisible(true);
                System.out.print("enter to finish program");
                in.nextLine();
                System.exit(1);
         }
}


 

page précédantetable des matièrespage suivante