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.
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é.
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
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);
}
}
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");
}
}
import java.awt.*; |
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); } } |
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:
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 { class B1
implements ActionListener { } |
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;
}
}
"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); } } } |
import java.awt.event.*; |