Interfaces graphiques Java Swing

Java Programming · notes

Voir tous les documents en programmation

interfaces graphiques Java Swing

Page 1

Toolkits graphiques Java

Il y en a trois !

AWT Components, obsol te

Swing support par Oracle (autrefois Sun)

Swing repose sur AWT

mais Swing != AWT !

SWT libre, initi par IBM / Eclipse

tous (+ ou -) multi-plateformes

J F C

Les classes Swing font partie d un ensemble plus vaste

de classes pour les IHM qui a t appel les Java

Fondation Classes.

Les JFC contiennent :

java.awt, javax.swing, le package java.awt.geom pour

dessiner du 2D, java.awt.dnd pour le drag and drop,

javax.accessibility pour d velopper des applications

adapt es aux personnes handicap es, javax.swing.plaf

pour modifier le look and feel, etc.

Page 2

Source: documentation IBM

Composants Swing

Page 3

Interacteurs

Page 4

Boutons

JButton

JCheckbox :

choix id pendants

JRadioButton :

choix exclusif : cf. ButtonGroup

Source: documentation Java Oracle

Page 5

Texte

JTextField

JPasswordField

Page 6

JTextArea :

texte simple multilignes

Ascenseur :

cf. JScrollPane

JEditorPane : texte avec styles

compatible HTML et RTF

Conteneurs

JPanel: conteneur g n rique

...

JScrollPane:

avec ascenseurs int gr s

JSplitPane:

avec diviseur int gr

Page 7

Conteneurs

JToolBar: barre doutils

(sous la barre de menus)

JTabbedPane:

onglets

JTree

JTable

Page 8

Conteneurs sp cifiques

JInternalFrame

placer dans un JDesktopPane

qui joue le r le de bureau virtuel

JLayeredPane permet de superposer

des composants

voir aussi JRootPane pr sent plus loin

JDesktopPane h rite de JLayeredPane

Page 9

Fen tres

JFrame : fen tre principale de lapplication

JDialog : fen tre secondaire

normalement d pendante de la JFrame :

" pas diconification s par e, toujours au dessus de la JFrame

g n ralement temporaire :

" bloque linteraction, impose lutilisateur de r pondre

Page 10

Fen tres

JRootPane implicitement cr

par JApplet, JDialog, JFrame

et JInternalFrame

Page 11

Bo tes de dialogue pr d finies

JFileChooser

JColorChooser

Particularit

peuvent tre cr s :

" comme composants internes

" ou comme bo tes de dialogue

JOptionPane (multiples variantes)

Page 12

Applets

Page 13

Menus

Page 14

Applet = composant de premier niveau

pour les applications dans pages Web

raccourci

clavier

(accelerator)

mn monique

Arbre dinstanciation

Arbre dinstanciation

arbre de liation des instances de composants graphiques

Page 15

Arbre dinstanciation

Chaque objet graphique contient ses enfants

superposition : enfants afch s au dessus des parents

clipping : enfants d coup s : ne d passent pas des parents

Page 16

Arbre dinstanciation

Attention : ne pas confondre avec larbre dh ritage !

arbre dinstanciation = arbre de liation des instances

arbre dh ritage = hi rarchie des classes

Page 17

Arbre dinstanciation

Objet de plus haut niveau de larbre

JFrame ou JApplet

Les conteneurs peuvent tre embo t s

en particulier les JPanels

Les layout managers assurent la disposition spatiale

un layout manager par conteneur

d faut pour JPanel : FlowLayout, pour JWindow : BorderLayout, etc.

Ne pas oublier dappeler

frame.pack( )

frame.setVisible(true)

// calcul r cursif des positions et des tailles

// fait appara tre la fen tre

Page 18

Exemple : version 0

// donne acc s aux composants Swing

import javax.swing.*;

public class BipBip extends JFrame { // fen tre principale

JButton button = null;

public static void main(String argv[ ]) {

BipBip toplevel = new BipBip(); // en gris : optionnel

}

public BipBip() {

button = new JButton ("Please Click Me !");

getContentPane().add(button); // en gris : n cessaire avant version 5

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setTitle("Bib Bip");

pack();

setVisible(true); // fait appara tre linterface

// calcule la disposition spatiale

}

}

Page 19

Exemple : version 0

Notes et rappels

package javax.swing

une seule classe public par fichier, le fichier doit avoir le m me nom

button est une variable dinstance (on peut linitialiser contrairement C++)

toplevel est une variable locale

main() est une m thode de classe (cf. static)

les m thodes dinstance ont automatiquement acc s aux variables dinstance

elles ont un param tre cach this qui pointe sur linstance

getContentPane() n cesaire avant la version 5 cause du JRootPane

JWindow.add() a t red fini dans les versions ult rieure de Java

Page 20

Ev nements

Ev nements

envoy s lapplication cibl e

chaque action l mentaire de lutilisateur

Page 21

Boucle de gestion des v nements

Boucle infinie qui

r cup re les v nements

appelle les fonctions de callback des composants graphiques

Lanc e automatiquement

la fin de la fonction main() dans le cas de Java

Page 22

Pattern Observateur/Observ

Principe

associer un(des) observateur(s) un(des) objet(s) observ (s)

observateur(s) notifi (s) automatiquement quand une certaine

condition se produit sur un observ

Page 23

Application aux interfaces graphiques

Les observateurs d tectent les v nements

ce sont des fonctions de callback (en C, C++...)

ou des objets : Listeners en Java

" leurs m thodes font office de fonctions de callback

Page 24

Ev nements Java

Ev nements AWT et Swing

objets correspondant des cat gories d venements

les principaux h ritent de java.awt.event.AWTEvent

Ev nements de bas niveau

Publicité

/ MouseEvent appuyer, relacher, bouger la souris ...

/ KeyEvent appuyer, relacher une touche clavier...

WindowEvent

FocusEvent

etc.

fermeture des fen tres ....

focus clavier (= o vont les caract res tap s au clavier)

Ev nements de haut niveau

/ ActionEvent activer un bouton, un champ textuel ...

abstraction des v nements de bas niveau

/ TextEvent modification du texte entr

etc.

Page 25

Ev nements Java

M thodes communes aux AWTEvent

getSource() objet producteur (Object)

/ getID() type d v nement (int)

Exemple: m thodes de MouseEvent

getX(), getY()

getClickCount()

getModifiers()

getWhen()

etc.

Page 26

Observateurs d v nements

Event Listeners

chaque classe d v nement correspond une classe dEventListener

(en g n ral)

Exemple : ActionEvent

Ev nement : ActionEvent

Listener : ActionListener

M thode : actionPerformed(ActionEvent)

Page 27

Observateurs d v nements

Exemple : MouseEvent

Ev nement : MouseEvent

Listener : MouseListener

M thodes :

" mouseClicked(MouseEvent)

" mouseEntered(MouseEvent)

" mouseExited(MouseEvent)

" mousePressed(MouseEvent)

" mouseReleased(MouseEvent)

Listener : MouseMotionListener

M thodes :

" mouseDragged(MouseEvent)

" mouseMoved(MouseEvent)

Remarque

toutes les m thodes doivent tre impl ment es

car les Listeners sont des interfaces (au sens du langage Java)

Page 28

Rendre les composants r actifs

Associer des Listeners aux composants graphiques

un composant peut avoir plusieurs listeners

un m me listener peut tre associ plusieurs composants

Page 29

Exemple : version 1

import javax.swing.*;

import java.awt.event.*;

public class BipBip extends JFrame {

JButton button;

public static void main(String argv[ ]) {

new BipBip();

}

public BipBip() {

class Ecoute implements ActionListener

{

// m thode appel e quand on active le bouton

public void actionPerformed(ActionEvent e) {

System.out.println("Done!");

button = new JButton ("Do It!");

add(button);

}

}

// cr er et associer un ActionListener

Ecoute elc = new Ecoute();

button.addActionListener(elc);

Probl me ?

setDefaultCloseOperation(EXIT_ON_CLOSE);

pack();

setVisible(true);

}

}

Page 30

Exemple : version 1

import javax.swing.*;

import java.awt.event.*;

public class BipBip extends JFrame {

JButton button;

JLabel label = new JLabel();

public static void main(String argv[ ]) {

new BipBip();

}

public BipBip() {

button = new JButton ("Do It!");

add(button);

// cr er et associer un ActionListener

Ecoute elc = new Ecoute();

button.addActionListener(elc);

setDefaultCloseOperation(EXIT_ON_CLOSE);

pack();

setVisible(true);

}

}

Page 31

class Ecoute implements ActionListener

{

public void actionPerformed(ActionEvent e) {

System.out.println("Done!");

label.setText("Done!"); // ne compile pas !

}

}

Probl me :

communication entre objets

comment le Listener peut-il agir

sur les composants graphiques ?

Exemple : version 1

import javax.swing.*;

import java.awt.event.*;

public class BipBip extends JFrame {

JButton button;

JLabel label = new JLabel();

public static void main(String argv[ ]) {

new BipBip();

}

public BipBip() {

button = new JButton ("Do It!");

add(button);

// cr er et associer un ActionListener

Ecoute elc = new Ecoute(this);

button.addActionListener(elc);

setDefaultCloseOperation(EXIT_ON_CLOSE);

pack();

setVisible(true);

}

}

Page 32

class Ecoute implements ActionListener {

BipBip mainWin;

public Ecoute (BipBip mainWin) {

this.mainWin = mainWin;

}

public void actionPerformed(ActionEvent e) {

System.out.println("Done!");

mainWin.label.setText("Done!");

}

}

Solution

le Listener doit conserver une

r f rence vers la partie graphique

solution flexible mais lourde...

Objets hybrides

A la fois composant graphique et Listener

un seul objet => plus de probl me de communication entre objets !

principe de lh ritage multiple

" simplifi dans le cas de Java : on ne peut h riter de fa on multiple

que des sp cifications (i.e. des interfaces)

Page 33

Exemple : version 2

import javax.swing.*;

import java.awt.event.*;

public class BipBip extends JFrame

implements ActionListener {

JButton button;

JLabel label = new JLabel();

public static void main(String argv[ ]) {

new BipBip();

}

public BipBip() {

public void actionPerformed(ActionEvent e) {

label.setText("Done!");

}

} // fin de la classe BibBip

add(button = new JButton ("Do It"));

// BibBip est la fois un JFrame et un Listener

button.addActionListener(this);

setDefaultCloseOperation(EXIT_ON_CLOSE);

pack();

setVisible(true);

Remarque

actionPerformed() acc s label

car cest une m thode dinstance

de BibBip

Autre probl me ?

}

Page 34

Exemple : version 2

import javax.swing.*;

import java.awt.event.*;

Publicité

public class BipBip extends JFrame

implements ActionListener {

JButton button;

JLabel label = new JLabel();

public static void main(String argv[ ]) {

new BipBip();

}

public BipBip() {

add(button = new JButton ("Do It"));

public void actionPerformed(ActionEvent e) {

label.setText("Done!");

}

} // fin de la classe BibBip

// BibBip est la fois un JFrame et un Listener

button.addActionListener(this);

setDefaultCloseOperation(EXIT_ON_CLOSE);

pack();

setVisible(true);

Probl me : plusieurs boutons

comment avoir plusieurs

comportements avec

un seul Listener ?

}

Page 35

Exemple : version 2

import javax.swing.*;

import java.awt.event.*;

public class BipBip extends JFrame

implements ActionListener {

JButton doIt, close;

JLabel label = new JLabel();

public static void main(String argv[ ]) {

new BipBip();

}

public BipBip() {

add(doIt = new JButton ("Do It"));

add(close = new JButton ("Close"));

doIt.addActionListener(this);

close.addActionListener(this);

setDefaultCloseOperation(EXIT_ON_CLOSE);

pack();

setVisible(true);

}

Page 36

public void actionPerformed(ActionEvent e) {

if (e.getSource() == doIt)

label.setText("Done!");

else if (e.getSource() == close)

System.exit(0);

}

}

Solution

distinguer les boutons gr ce

" getSource() ou

" getActionCommand()

la 1ere solution est plus s re

peu adapt si beaucoup de

commandes

Avantages et inconv nients

Version 1

plus souple :

autant de listeners que l'on veut

mais lourd et peu concis :

on multiplie les objets et les lignes

de code

Version 2

plus simple mais limit :

on ne peut avoir qu'une seule

m thode actionPerformed()

peu adapt si beaucoup de

commandes

Page 37

3eme solution : classes imbriqu es

Classes d finies lint rieur dune autre classe

ont acc s aux variables dinstance des classes qui les contiennent

Combinent les avantages des 2 solutions

pr c dentes

souplesse sans la lourdeur

Page 38

Exemple : version 3

import javax.swing.*;

import java.awt.event.*;

BipBip extends JFrame {

JButton doIt, close;

JLabel label = new JLabel();

public static void main(String argv[ ]) {

new BipBip();

}

public BipBip() {

class DoItListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

label.setText("Done!");

}

}

class CloseListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

System.exit(0);

}

}

add(doIt = new JButton ("Do It"));

add(close = new JButton ("Close"));

} // fin de la classe BibBip

doIt.addActionListener(new DoItListener( ));

close.addActionListener(new CloseListener( ));

Remarque

setDefaultCloseOperation(EXIT_ON_CLOSE);

pack();

setVisible(true);

actionPerformed() acc s

label car DoItListener est une

classe imbriqu e de BibBip

}

Page 39

Synth se

Page 40

Remarques

Remarques

les classes imbriqu es peuvent galement servir encapsuler limpl mentation

le terme exact est classes internes (inner classes en Anglais)

Page 41

Classes imbriqu es anonymes

Classes imbriqu es... qui nont pas de nom !

public class BipBip extends JFrame {

JLabel label = new JLabel(); // label doit tre une variable dinstance (pas une variable locale)

......

// car elle est r f renc e dans une m thode dinstance

public BipBip() {

JButton doIt = new JButton ("Do It");

add(doIt);

doIt.addActionListener(new ActionListener( )) { // sous-classe anonyme de ActionListener

public void actionPerformed(ActionEvent e) {

label.setText("Done!");

}

});

......

Page 42

abstract class MyButton extends JButton implements ActionListener {

MyButton(String name) {

super(name);

addActionListener(this);

}

}

public class BipBip extends JFrame {

JLabel label = new JLabel();

......

public BipBip() {

add(new MyButton("Do It")) {

public void actionPerformed(ActionEvent e) {

label.setText("Done!");

}

});

......

Page 43

Conflits

public class BipBip extends JFrame {

JButton close = new JButton("Close");

class CloseListener implements ActionListener {

boolean close = false

public void actionPerformed(ActionEvent e) {

setVisible(close);

// OK

setVisible(BipBip.close);

// FAUX : pas le bon close

this.setVisible(close);

// ERREUR : pas le bon this

BipBip.this.setVisible(close);

// OK

}

}

M me nom de variable dans classe imbriquante et classe imbriqu e

/ 1) viter !

/ 2) pr fixer par le nom de la classe

Page 44

Remarques sur les constructeurs

abstract class MyButton extends JButton implements ActionListener {

public MyButton(String name, Icon icon) {

super(name, icon);

........

}

public MyButton (String name) {

this(name, null);

}

}

Un constructeur peut en appeler un autre

Page 45

Remarques sur les constructeurs

abstract class Toto {

static { // constructeur de classe

.......

Publicité

}

}

Constructeur de classe

sert effectuer des op rations sur les variables de classe (initialisations)

nexiste pas en C++

Page 46

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Applets

Application

Programme ind pendant

" interpr t par la commande java

Structure

" h rite de JFrame (pour une GUI)

" m thode main()

" peut tre interfac e avec un autre langage (interfaces natives)

Applet (appliquette)

Programme pour navigateur Web

" interpr t par navigateur Web ou commande appletviewer

" attention: restrictions dacc s (fichiers, sockets ...)

Structure

" h rite de JApplet

" m thode init() (pas de new !)

Page 47

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Scribble : dessin dans une applet

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

public class Scribble extends JApplet

implements MouseListener, MouseMotionListener

{

private int last_x, last_y;

public void init( ) {

// enregistrer les Listeners

this.addMouseListener(this);

this.addMouseMotionListener(this);

this.setBackground(Color.white);

}

// m thode de linterface MouseListener

public void mousePressed(MouseEvent e) {

last_x = e.getX( );

last_y = e.getY( );

}

Page 48

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Scribble : dessin dans une applet

....(suite)....

// m thode de linterface MouseMotionListener

public void mouseDragged(MouseEvent e) {

Graphics g = getGraphics( );

int x = e.getX( );

int y = e.getY( );

g.drawLine(last_x, last_y, x, y);

last_x = x;

last_y = y;

}

// m thodes inutilis es des Listeners

public void mouseReleased (MouseEvent e) { }

public void mouseClicked (MouseEvent e) { }

public void mouseEntered (MouseEvent e) { }

public void mouseExited(MouseEvent e) { }

public void mouseMoved(MouseEvent e) { }

}

Page 49

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Scribble : dessin dans une applet

Dans la page Web

<!-- Applet Scribble : code a inserer dans le chier HTML -->

<html>

<body>

<applet code=Scribble.class width=300 height=300> </applet>

</body>

</html>

Pour tester lapplet

appletviewer fichier-html

ou avec votre navigateur favori

Page 50

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avec les classes imbriqu es

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

public class Scribble extends JApplet {

private int last_x, last_y;

public void init( ) {

// ! NB: rajouter getContentpane(). avant Java 5 !

setBackground(Color.white);

// d finir, instancier et enregistrer le Listener

addMouseListener(

new MouseAdapter ( ) {

public void mousePressed(MouseEvent e) {

last_x = e.getX( );

last_y = e.getY( );

}

} );

Page 51

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avec les classes imbriqu es

....(suite)....

addMouseMotionListener(

new MouseMotionAdapter ( ) {

public void mouseDragged(MouseEvent e) {

// m me code que dans la pr c dente version

....

}

} );

// ajouter un bouton qui efface tout

JButton b = new JButton("Clear");

add(b);

b.addActionListener(

new ActionListener ( ) {

public void actionPerformed(ActionEvent e) {

Graphics g = getGraphics( );

g.setColor(getBackground( ));

g.fillRect(0, 0, getSize( ).width, getSize( ).height);

}

} );

Page 52

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Persistance de laffichage

Probl mes de lexemple pr c dent

/ 1) laffichage du dessin nest pas persistant !

"/ il est effac si on d place une fen tre dessus, si on iconifie...

(en fait a d pend des plateformes)

/ 2) normalement les m thodes des listeners ne doivent pas dessiner

Page 53

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Persistance de laffichage

Probl mes de lexemple pr c dent

/ 1) laffichage du dessin nest pas persistant !

"/ il est effac si on d place une fen tre dessus, si on iconifie...

(en fait a d pend des plateformes)

/ 2) normalement les m thodes des listeners ne doivent pas dessiner

Solution

/ m moriser la liste des op rations graphiques dans une display list

/ r afficher le dessin quand le composant qui le contient est rafra chi

Page 54

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

R afficher le dessin (1)

Pour r afficher le dessin avec AWT

red finir la m thode paint()

Pour r afficher le dessin avec Swing

red finir la m thode paintComponent()

car paint() appelle paintComponent() puis paintBorder() puis paintChildren()

class Dessin extends JPanel {

public void paintComponent(Graphics g) {

super.paintComponent(g);

// ne pas oublier cette ligne !

....etc...

}

}

Page 55

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

R afficher le dessin (2)

Pour indiquer quil faut r afficher le dessin

repaint() dans les m thodes des Listeners

=> appel automatique de paint() quand on revient dans la boucle

de gestion des v nements

les repaint() sont compact s (un seul paint())

Page 56

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Divers

Divers

Appeler revalidate() dans certains cas de changements de taille

Taille des bords : getInsets()

Opacit des widgets

" certains composants sont opaques, dautres sont transparents

" setOpaque() => composant opaque (et plus rapide)

Page 57

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

JFileChooser

JFileChooser chooser = new JFileChooser();

FileNameExtensionFilter filter = new FileNameExtensionFilter ("JPG & GIF Images",

"jpg", "gif"););

chooser.setFileFilter(filter);

// ouvre la bo te de dialogue et bloque linteraction (dialogue modal)

int returnVal = chooser.showOpenDialog(parent);

if (returnVal == JFileChooser.APPROVE_OPTION) {

System.out.println("You chose to open this file: "

+ chooser.getSelectedFile().getName());

}

Page 58

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Disposition spatiale

Les LayoutManagers

calculent automatiquement la disposition spatiale

des enfants des Containers

A chaque conteneur est associ un LayoutManager

qui d pend du type de conteneur

Publicité

qui peut tre chang par la m thode setLayout()

" conteneur.setLayout(unAutreLayoutManager)

Pour faire le calcul " la main"

viter sauf cas particuliers

" conteneur.setLayout(null)

Page 59

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avantages des LayoutManagers

C'est plus simple

pas de calculs compliqu s programmer !

Page 60

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avantages des LayoutManagers

C'est plus simple

pas de calculs compliqu s programmer !

Configurabilit

accessibilit : ind pendance par rapport aux tailles des polices

internationalisation : ind pendance par rapport la longueur du texte

" langues orientales : texte ~1/3 plus petit que l'anglais

" fran ais, allemand : texte ~1/3 plus grand que l'anglais

Page 61

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avantages des LayoutManagers

C'est plus simple

pas de calculs compliqu s programmer !

Configurabilit

accessibilit : ind pendance par rapport aux tailles des polices

internationalisation : ind pendance par rapport la longueur du texte

" langues orientales : texte ~1/3 plus petit que l'anglais

" fran ais, allemand : texte ~1/3 plus grand que l'anglais

Adaptativit des interfaces

les composants graphiques se retaillent automatiquement

quand l'utilisateur retaille les fen tres

Page 62

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Principaux LayoutManagers

FlowLayout

/ d faut des JPanel

/ met les objets la suite comme un "flux textuel" dans une page

"/ de gauche droite puis la ligne

Page 63

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Principaux LayoutManagers

BorderLayout

/ d faut des JFrame et JDialog

/ retaille automatiquement les enfants du conteneur

/ disposition de type points cardinaux

"/ via constantes: BorderLayout.CENTER, EAST, NORTH, SOUTH, WEST

Page 64

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Principaux LayoutManagers (2)

GridLayout

/ divise le conteneur en cellules de m me taille (grille virtuelle)

"/ de gauche droite et de haut en bas

/ retaille automatiquement les enfants

Page 65

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Principaux LayoutManagers (2)

GridBagLayout

/ grille + contraintes spatiales

"/ les enfants n'ont pas tous la m me taille

"/ sp cification par des

GridBagConstraints

Page 66

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Principaux LayoutManagers (3)

CardLayout

empile les enfants (et les met la m me taille)

usage typique: pour les onglets

BoxLayout

disposition verticale ou horizontale

exemple vu pr c demment :

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

SpringLayout

contraintes entre les bords des enfants

Page 67

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Autres toolkits graphiques Java

AWT Components

"Abstract Widget Toolkit"

plus ancien et moins puissant que Swing

attention: m me noms que Swing mais ... sans le J !

" exemple: JButton (Swing) et Button (AWT)

SWT

"Standard Widget Toolkit"

d velopp pour Eclipse

open source

m me type d'architecture que AWT

Page 68

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

AWT versus Swing

AWT

couche "abstraite" qui encapsule les widgets natifs de la plateforme

look & feel diff rent suivant l'OS

Swing

r impl mente tous les widgets en simulant les look & feel natifs

=> look & feel ind pendant de l'OS

=> comportement ( peu pr s) homog ne qq soit l'OS

architecture logicielle plus sophistiqu e

bien plus puissant !

Page 69

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Architecture Swing

Swing est inspir du mod le MVC

Model : donn es de l'application

View : repr sentation visuelle

Controller : gestion des entr es

source: enode.com

Page 70

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Architecture Swing

Swing est inspir du mod le MVC

Model : donn es de l'application

View : repr sentation visuelle

Controller : gestion des entr es

But de MVC

mieux structurer les applications

repr sentations multi-vues

" un mod le peut tre associ plusieurs vues

" la synchronisation est implicite

source: enode.com

Remarques

en pratique V est fortement li C

plusieurs variantes de MVC !

Page 71

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Architecture Swing (2)

"Separable Model Architecture"

View et Controller regroup s dans un UIComponent

Model : reste s par

"Pluggable Look and Feel"

chaque JComponent Swing encapsule un UIComponent

les UIComponent peuvent tre chang s dynamiquement par le UIManager

Page 72

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Architecture Swing (3)

Mod les et multi-vues

(la plupart des) JComponent Swing cr ent implicitement un Mod le

qui peut tre "export " et partag avec un autre JComponent

Exemple

JSlider et JScrollbar : m me mod le BoundedRangeModel

mise commun du mod le => synchronisation automatique

Page 73

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Exemple

Dans lAPI de JSlider et JScrollBar :

public BoundedRangeModel getModel();

public void setModel(BoundedRangeModel);

Changer le mod le du slider et du scrollbar :

JSlider slider = new JSlider();

BoundedRangeModel myModel = new DefaultBoundedRangeModel( ) {

public void setValue(int n) {

System.out.println(SetValue: + n);

super.setValue(n);

}

});

slider.setModel(myModel);

scrollbar.setModel(myModel);

On peut aussi ignorer lexistence des mod les :

JSlider slider = new JSlider();

int value = slider.getValue();

// coh rent car dans lAPI de JSlider :

public int getValue() {return getModel().getValue(); }

Page 74

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Pluggable Look and Feel

Java Metal

public static void main(String[ ] args) {

try {

UIManager.setLookAndFeel(

UIManager.getCrossPlatformLookAndFeelClassName());

} catch (Exception e) { }

//Create and show the GUI...

.....

}

Windows

UIManager.setLookAndFeel(

com.sun.java.swing.plaf.windows.WindowsLookAndFeel

);

Page 75

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Une variante de MVC

Page 76

Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

source: Sun