95
Swing_MVC 1 Swing et MVC Notes de cours jean-michel Douin, douin au cnam point fr version : 30 Octobre 2014

MVC Swing Intro JSF

Embed Size (px)

DESCRIPTION

JAVA J2EE

Citation preview

  • Swing_MVC1

    Swing et MVC

    Notes de cours

    jean-michel Douin, douin au cnampoint frversion : 30 Octobre 2014

  • Swing_MVC2

    Sommaire

    LAPI Swing Un descriptif Exemples

    Dmonstration

    Usage des patrons Composite, stratgie, fabrique

    Evnements, MVC Usage des patrons

    Observateur, Commande Mise en uvre du Modle, Vue, Contrleur Exemples

    Dmonstration Le modle devient un java Bean MVC dun composant swing

    JSF prsentation IHM et HTML

    Du swing ct serveur de lHTML ct client

    MVC et Web

  • Swing_MVC3

    Principale bibliographie utilise

    Swing, recherche google http://notes.corewebprogramming.com/student/Basic-Swing.pdf mathinfo.ens.univ-reims.fr/.../ppt /Swing _et_les_Applications_Graphiques.ppt

    Divers Certains diagrammes UML : http://www.dofactory.com/Patterns/PatternProxy.aspx informations gnrales http://www.edlin.org/cs/patterns.html

  • Swing_MVC4

    LAPI Swing

    Prsentation dclarative

    Le package javax.swing

    Les composants graphiques

    Quelques exemples en direct

    Avertissement : Prsentation de lAPI Swing oriente JSF

  • Swing_MVC5

    Swing en images, javax.swing

  • Swing_MVC6

    Le paquetage swing bien nomm

    javax.swingComposants lmentairesMenus, Barre doutils et

    ToolTipsContainers

    javax.swing.beaninfo javax.swing.beaninfo.images javax.swing.border javax.swing.colorchooser javax.swing.event

    javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.table javax.swing.text javax.swing.text.html javax.swing.tree javax.swing.undo

  • Swing_MVC7

    Hirarchie de classes 1/2, tout est JComponent

    Container JComponent

    AbstractButton JButton JMenuItem

    JCheckBoxMenuItem

    JMenu

    JRadioButtonMenuItem JToggleButton

    JCheckBox

    JRadioButton

  • Swing_MVC8

    Hirarchie 2/2, JComponent suite

    JComponent JComboBox JLabel JList JMenuBar JPanel JPopupMenu JScrollBar JScrollPane JTextComponent

    JTextArea JTextField

    JPasswordField JTextPane

    JHTMLPane

  • Swing_MVC9

    Autres Composants, toujours des JComponent

    JRootPane JSeparator JSlider JSplitPane JTabbedPane JTable JToolBar JToolTip JTree JViewport

    FontChooser JColorChooser JDesktopIcon JDirectoryPane

    JFileChooser

    JImagePreviewer JInternalFrame JLayeredPane

    JDesktopPane

    JOptionPane JProgressBar

  • Swing_MVC10

    Exemples 1/3, en images

    Menus, Barre doutils et ToolTips

    JMenuBar JMenu JMenuItem JCheckBoxMenuItem JRadioButtonMenuItem JPopupMenu JToolBar JToolTip

  • Swing_MVC11

    Exemples 2/3

    Composants Textes

    JPasswordField JTextField JTextArea JTextPane JEditorPane

  • Swing_MVC12

    Exemples 3/3

    Containers

    JOptionPane JDialog JTabbedPane JSplitPane JScrollPane JFrame JInternalFrame JDesktopPane JWindow

  • Swing_MVC13

    Hirarchie, suite, top-level et les autres

    Les Top Level containers et les autres JDialog , JFrame , JWindow , JApplet , JInternalFrame

    hritent de Window

    Les autres sont des JComponent Ils sont ajouts au content pane dun top level container

  • Swing_MVC14

    RootPaneContainer

    Pas dajout direct au container (top level) aFrame.add (new Button (Help)); non

    Ajout au content pane aJFrame.getContentPane().add ( new Button (Help)); oui

    RootPaneContainer dfinit la mthode getContentPane Impltente par

    public Container getContentPane() { return getRootPane().getContentPane(); }

    Les top-level JDialog , JFrame , JWindow , JApplet , JInternalFrame

  • Swing_MVC15

    Un exemple

    import javax.swing.JFrame;import javax.swing.JButton;import javax.swing.JLabel;

    import java.awt.Container;import java.awt.FlowLayout;import java.awt.Button;

    public class FrameTester {public static void main (String args[]) {

    JFrame f = new JFrame ("Exemple de JFrame");Container c = f.getContentPane();c.setLayout (new FlowLayout()); // placement des objets ( suivre)for (int i = 0; i < 5; i++) {

    c.add (new JButton (Integer.toString(i))); // swingc.add (new Button (Integer.toString(i))); // awt

    }c.add (new JLabel ("Swing"));f.setSize (300, 200);f.show();

    }}

    f.getContentPane();

  • Swing_MVC16

    ContentPane

    Le contenu

  • Swing_MVC17

    Disposition des objets dans un container

    LayoutManager FlowLayout, BorderLayout, GridLayout

    Composite, Strategy deux Patrons ? suivre

    B u tto n( fro m a w t )

    B o rd e rL a y o u t( fro m a w t )

    C o m p o n e n t( fro m a w t )

    G r i d L a y o u t( fro m a w t )

    L a y o u tM a n a g e r2( fro m a w t )

    < < In te r fa c e > >

    C o n ta i n e r( fro m a w t )

    c o m p o n e n t[]

    L a y o u tM a n a g e r( fro m a w t )

    < < In te r fa c e > >la y o u tM g r

    Composite ?

    Strategy ?

  • Swing_MVC18

    Les Layout

    BorderLayout FlowLayout GridLayout CardLayout .

  • Swing_MVC19

    BorderLayout

    En 5 zonesBorderLayout.NORTH

    BorderLayout.WEST BorderLayout.CENTER, BorderLayout.EAST

    BorderLayout.SOUTH

  • Swing_MVC20

    FlowLayout

    comme ils viennent

  • Swing_MVC21

    Grid Layout

    En une table

  • Swing_MVC22

    Un exemple dIHM : une JApplet

    Deux boutons , un texte , une liste

    JApplet

    JPanel (ContentPane)

    JButton JButton JPanel

    JScrollPaneJTextField

    JList

  • Swing_MVC23

    Exemple, Deux boutons, un texte, une liste

    // quelques dclarations

    JPanel contentPane;

    JButton jButton1 = new JButton();

    JButton jButton2 = new JButton();

    JTree jTree1 = new JTree();

    JTextField jTextField1 = new JTextField();

    JPanel jPanel1 = new JPanel();

    JScrollPane jScrollPane1 = new JScrollPane();

    BorderLayout borderLayout1 = new BorderLayout();

  • Swing_MVC24

    Construction de larbre

    contentPane = this.getContentPane(); // this est une JApplet

    contentPane.add(jButton1, null);contentPane.add(jButton2, null);contentPane.add(jPanel1, null);

    jPanel1.add(jScrollPane1, BorderLayout.CENTER );jPanel1.add(jTextField1, BorderLayout.NORTH );jScrollPane1.getViewport().add(jTree1, null);

  • Swing_MVC25

    Divers : de JApplet en JFrame

    static void run(JApplet applet, int width, int height) {

    JFrame frame = new JFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );

    frame.getContentPane().add(applet);frame.setSize(width, height);

    applet.init();applet.start();frame.setVisible(true);

    }

    Larbre change de racine

  • Swing_MVC26

    Un autre exemple : Un formulaire

    public class LoginForm extends JFrame {

    public LoginForm() {super("LoginForm");Container contents = getContentPane();

    // contents.setLayout(new BorderLayout()); // par d faut

    contents.add( getLoginPanel (), BorderLayout.CENTER);contents.add( getButtonPanel (), BorderLayout.SOUTH);pack(); setVisible(true);

    }

  • Swing_MVC27

    Le dessin suite

    public JPanel getLoginPanel() {JPanel panel = new JPanel(new BorderLayout());JPanel labelPanel = new JPanel(new GridLayout(2,0));JLabel userIdLabel = new JLabel("User ID:");labelPanel.add(userIdLabel);JLabel passwordLabel = new JLabel("Password:");labelPanel.add(passwordLabel);panel.add(labelPanel, BorderLayout.WEST);JPanel fieldPanel = new JPanel(new GridLayout(2,0));JTextField userIdField = new JTextField(10);fieldPanel.add(userIdField);JPasswordField passwordField = new JPasswordField(10);fieldPanel.add(passwordField);panel.add(fieldPanel, BorderLayout.CENTER);return panel;

    }

    public JPanel getButtonPanel() {JPanel panel = new JPanel(new FlowLayout());JButton okButton = new JButton("OK");panel.add(okButton); return panel;

    }

  • Swing_MVC28

    Dmonstration

    Un Arbre ?

  • Swing_MVC29

    Autres composants

    suivre

    Fentres de dialogues JOptionPane

    Apparence des objets graphiques Apparence windows , Metal, UIManager.setLookAndFeel

  • Swing_MVC30

    Une autre famille : JOptionPane

  • Swing_MVC31

    Un exemple

    import javax.swing.JOptionPane;

    public class JOption{

    public static void main(String[] args) {

    Object response = JOptionPane.showInputDialog(null, "au choix", "Titre",

    JOptionPane.QUESTION_MESSAGE,

    null,

    new Object[] { "Amandes", "Noisettes", "Noix"}, "No ix");

    // response = ( "Amandes" | "Noisettes" | "Noix" | n ull)

    }

    }

  • Swing_MVC32

    Au choix

    Lecture bloquante jusqu ce que lutilisateur

    Unification des 3 prcdents.showOptionDialog

    Une indication.showMessageDialog

    Demande un choix (c.f. exemple prcdent).showInputDialog

    Pose une question oui/non/annuler.showConfirmDialog

    DescriptionMthode

  • Swing_MVC33

    Les Apparences LookAndFeel

    Choix de lapparence.

    Metal (par dfaut) UIManager.setLookAndFeel("javax.swing.plaf.metal.Me talLookAndFeel");

    Windows UIManager.setLookAndFeel("com.sun.java.swing.plaf.w indows.WindowsLookAndFeel");

    Apparence Motif UIManager.setLookAndFeel("com.sun.java.swing.plaf.m otif.MotifLookAndFeel");

  • Swing_MVC34

    Apparence Windows

  • Swing_MVC35

    Apparence Mtal (Par Dfaut)

  • Swing_MVC36

    Swing : o sont les patrons ?

    Patron Composite Construction dune IHM

    Patron Stratgie Disposition des objets graphiques

  • Swing_MVC37

  • Swing_MVC38

    Le patron Composite, rappel

    Structures de donnes rcursives Un Composant est une feuille ou un composite Un Composite est un Composant

  • Swing_MVC39

    Le patron Composite et lAPI graphique

    ContainerJButtonJLabel

    Component

  • Swing_MVC40

    Le formulaire est une instance du composite !

    src : Mastering JSF page 31

  • Swing_MVC41

    list() comme operation()

    Mthode de la classe Component quelque soit larbre

    Component loginForm = new LoginForm (); loginForm.list();

    LoginForm[frame0,0,0,183x103,layout=java.awt.BorderLayout,title=LoginForm,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,4,23,175x76,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

    javax.swing.JRootPane[,4,23,175x76,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=]

    javax.swing.JPanel[null.glassPane,0,0,175x76,hidden,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777217,maximumSize=,minimumSize=,preferredSize=]

    javax.swing.JLayeredPane[null.layeredPane,0,0,175x76,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,optimizedDrawingPossible=true]

  • Swing_MVC42

    Retour sur Loriginal

    Mthode Operation() Component c = une feuille ou un composite C.Operation();

    Notons laccs aux enfants depuis un nud composite , classe Component Mthode getChild

  • Swing_MVC43

    Le patron Strategy

    Context ctxt = new Context(new ConcreteStrategyB()); Le champ dinstance aStrategy est affect par largument du constructeur

    Puis ctxt.contextInterface();

    Retournera un AlgorithmInterface () concret

  • Swing_MVC44

    Le patron Strategy et les layout

    Exemple : Container content = getContentPane(); content.setLayout(new BorderLayout());

    BorderLayout FlowLayout GridLayout

    LayoutManagerContainer

  • Swing_MVC45

    Les images (encore un patron), en appart

    Le chargement dune image peut-tre lent Si cest synchrone alors lapplication attend

    alors un chargement asynchrone simpose

    Pour cela usage Du paradigme Producteur/Consommateur Du patron observateur

    Une instance de la classe Image nest pas un tablea u de pixels mais un canal entre un producteur dimage et son consommate ur

    Limage est un observateur, notifie par le producteur

  • Swing_MVC46

    ImageObserver

    imageUpdate(img : Image, infoflags : int, x : int, y : int, width : int, height : int) : boolean

    Image

    getWidth(observer : ImageObserver) : intgetHeight(observer : ImageObserver) : intgetSource() : ImageProducergetGraphics() : GraphicsgetProperty(name : String, observer : ImageObserver) : ObjectgetScaledInstance(width : int, height : int, hints : int) : Imageflush() : void

    Component

    FilteredImageSource MemoryImageSource

    ImageProducer

    addConsumer(ic : ImageConsumer) : voidisConsumer(ic : ImageConsumer) : booleanremoveConsumer(ic : ImageConsumer) : voidstartProduction(ic : ImageConsumer) : voidrequestTopDownLeftRightResend(ic : ImageConsumer) : void

    src

    ImageConsumer

    setDimensions()setProperties()setColorModel()setHints()setPixels()setPixels()imageComplete()

    0..*0..*

    BufferedImage

  • Swing_MVC47

    Un exemple Aurores borales au Cnam ?

    public class ImageDemo {static public void main(String args[]) throws Exceptio n {

    JFrame f= new JFrame("test images");f.getContentPane().add(new MyPanel());f.setSize(300,200);f.setVisible(true);

    }

    static class MyPanel extends JPanel {private Image m1,m2;public MyPanel() throws MalformedURLException {

    Toolkit toolkit=Toolkit.getDefaultToolkit();m1=toolkit.getImage(new URL("http://www.cnam.fr/image s/logo_cnam.gif"));m2=toolkit.getImage(new

    URL("http://media.aftenposten.no/archive/00411/_127 4097_jpg_411307h.jpg"));

    }public void paintComponent(Graphics g) {Dimension d = getSize();g.drawImage(m2,0,0,this);g.drawImage(m1,0,0,this);

    }}}

  • Swing_MVC48

    Ragir aux clics : le formulaire dj vu

    Associer une action au clic sur OK lgitime

    Patron observateur/observ Les listeners

  • Swing_MVC49

    Patron observ/observateur-couteur( ou listener)

    1) enregistrement auprs du bouton dun couteur bouton.addActionListener(ActionListener al)

    Plusieurs couteurs sont possibles

    2) A chaque clic les couteurs sont notifis al.actionPerformed(ActionEvent ae)

    Lexemple du formulaire suit

  • Swing_MVC50

    le patron Observateur, loriginal

    http://www.codeproject.com/gen/design/applyingpatterns/observer.gif

  • Swing_MVC51

    Ajout dun observateur du bouton

    public JPanel getButtonPanel() {

    JPanel panel = new JPanel(new FlowLayout());

    JButton okButton = new JButton("OK");

    panel.add(okButton);

    okButton.addActionListener(new OkButtonAction());

    return panel;

    }

    }

  • Swing_MVC52

    OkButton action !!!

    class OkButtonAction implements ActionListener{

    public void actionPerformed(ActionEvent ae){// Vrification du nom et mot de passe// par exemple

    }

    }

    Diffrentes formes syntaxiques possiblesClasse interne et statiqueClasse interne et membreClasse anonyme

  • Swing_MVC53

    Action, Listeners et les autres, par convention

    Un composant swing enregistre ses couteurs addXXXXListener

    Les couteurs implmentent Linterface XXXXListener et sont des java.awt.event.EventListener

    Cette interface dcrit une mthode acceptant en par amtre un XXXXEvent Chaque couteur senregistre auprs du composant sw ing

    A chaque changement dtat du composant swing Les mthodes des couteurs pr-enregistrs sont exc utes

    Le paramtre XXXXEvent contient au moins la source d e la notification

  • Swing_MVC54

    EventListener et ses descendants

    Hritage au sens des interfaces

  • Swing_MVC55

    Des Adaptateurs adapter

    Implmenter un XXXXListener peut tre fastidieux Surtout si une seule mthode de linterface est con cerne

    Exemple : linterface WindowListener public void windowActivated (WindowEvent e) public void windowClosed (WindowEvent e) public void windowClosing (WindowEvent e) public void windowDeactivated (WindowEvent e) public void windowDeiconified (WindowEvent e) public void windowIconified (WindowEvent e) public void windowOpened (WindowEvent e)

    Au total 7 mthodes implmenter

    Utile : il existe une classe XXXXAdapter qui implme nte XXXXListener

    Exemple la classe WindowAdapter

  • Swing_MVC56

    XXXXAdapter adapter

    Exemple suite : WindowAdapter Au clic dans la case de fermeture alors arrt bruta l du programme Pas daction pour les 6 autres mthodes.

    Window w =

    w.addWindowListener( new WindowAdapter(){

    public void windowClosing(WindowEvent event) { System.exit(0);

    }});

  • Swing_MVC57

    Swing, un constat

    Cest une premire prsentation

    Des composants graphiques Une gestion des vnements Un look and feel indpendant

    IHM alors MVC Modle Vue Contrleur

    Comment ?, quel dploiement ?, pourquoi faire ?

  • Swing_MVC58

    Interactivit, MVC

    Linterface graphique La vue

    Interactions avec lutilisateur Le contrle

    Les donnes de lapplication Le modle

    A la recherchedune adquation des donnes de lapplication et de s vues

    Paradigme MVC Modle Vue Contrleur

  • Swing_MVC59

    MVC, doc de Sun

    http://java.sun.com/blueprints/patterns/MVC-detaile d.html Un exemple

  • Swing_MVC60

    MVC un exemple : un nombre !

    le modle: un nombre

    Une vueune jauge

    Dploiement ? IHM ? Contrle ? Modle ?

    50

    Un contrle

    37Une vue

    37Une JFrame

  • Swing_MVC61

    Dploiement ? Choix de classes

    Discussion Le modle : la classe Nombre La Vue : Une JFrame, une jauge, un affichage, des b outons Le Contrle : Ractions aux actions de lutilisateu r

  • Swing_MVC62

    Un dploiement possible, dmonstration

    La classe Nombre est Observable Elle hrite de java.util.Observable

    Les Vues sont des observateurs Elles implmentent java.util.Observer, Peuvent tre des IHM, des Container swing, Sans interface : des vues sans tre vues ?

    Par exemple : un journal des vnements

    Les Contrles grent les actions de lutilisateur Elles implmentent les XXXXListener des composants s wing Une classe par action ?

  • Swing_MVC63

    Exemple un nombre, une vue, un contrle

    public class MainNombreMVC{

    public static void main(String[] args){Nombre nombre = new Nombre(0,10); // le modle

    Vue1 vue1 = new Vue1(nombre);

    ControleVue1 controle1 = new ControleVue1(nombre, v ue1);

    }}

  • Swing_MVC64

    Le modlepublic class Nombre extends java.util.Observable{

    public final int VALEUR_MIN;public final int VALEUR_MAX;private int valeur;

    public Nombre(int min, int max){this.VALEUR_MIN = this.valeur = min;this.VALEUR_MAX = max;

    }

    public void inc(){if(valeur < VALEUR_MAX){

    this.valeur++;setChanged();notifyObservers();

    }}

    public void dec(){ // idem -- getValeur() + setValeur() + toString()

  • Swing_MVC65

    La Vue est une JFrame et implmente Observer

    public class Vue1 extends JFrame implements Observer{

    private JButton plus;private JButton moins;private JTextField valeur;private JSlider jauge;

    public Vue1(Nombre nombre) {super("Vue1 Nombre");nombre.addObserver(this);

    // Mise en place des composants graphiques

    pack();setVisible(true);

    }

    en quelques lignes , un arbre instance du composite

  • Swing_MVC66

    La Vue implmente java.util.Observer

    @Overridepublic void update(Observable obs, Object arg){if(obs instanceof Nombre){

    Nombre n = (Nombre)obs;this.valeur.setText(n.toString());this.jauge.setValue(n.getValeur());

    } }

    // accesseurspublic JButton getPlus(){return plus;}public JButton getMoins(){return moins;}

    }

  • Swing_MVC67

    Le Contrle implmente les XXXXListener

    public class ControleVue1{private Nombre nombre;

    public ControleVue1(Nombre nombre, Vue1 vue){this.nombre = nombre;vue.getMoins(). addActionListener(

    new ActionListener(){public void actionPerformed(ActionEvent ae){

    ControleVue1.this.nombre.dec();}

    });

    vue.getPlus(). addActionListener( new ActionListener(){

    public void actionPerformed(ActionEvent ae){ControleVue1.this.nombre.inc();

    }});

    }} adquation actions de lutilisateur / oprations su r le modle

  • Swing_MVC68

    Dmonstration

    Dmonstration

    MVC pourquoi faire ?

    Paradigme au-del de la maturit ? Loriginal en 1978 http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-inde x.html

    Donner lillusion lutilisateur de manipuler les donnes du modle

  • Swing_MVC69

    Une nouvelle vue, un nouveau contrle, critiques

    public class MainNombreMVC{

    public static void main(String[] args){Nombre nombre = new Nombre(0,10); // le modle

    Vue1 vue1 = new Vue1(nombre); ControleVue1 controle1 = new ControleVue1(nombre, v ue1);

    Vue2 vue2 = new Vue2(nombre); ControleVue2 controle2 = new ControleVue2(nombre, v ue2);

    }}

    lutilisateur peut maintenant modifier la valeur ajout dun observateur auprs dun JTextField

    soit jTextField.addActionListener

  • Swing_MVC70

    La classe Vue2, est un observateurpublic class Vue2 extends JFrame implements Observer {

    private JTextField valeur;private JSlider jauge;

    public Vue2(Nombre nombre) {super("Vue2 Nombre");nombre.addObserver(this);Container content = getContentPane();

    }

    public void update(Observable obs, Object arg){if(obs instanceof Nombre){ // instanceof prvention

    Nombre n = (Nombre)obs;this.valeur.setText(n.toString());this.jauge.setValue(n.getValeur());

    } }public JTextField getValeur(){return valeur;}}

    en quelques lignes

  • Swing_MVC71

    Le Contrle2 de la vue 2, implements XXXXListener

    public class ControleVue2{private Nombre nombre;private Vue2 vue2;

    public ControleVue2(Nombre nombre, Vue2 v){this.nombre = nombre;this.vue2 = v;

    vue2.getValeur(). addActionListener(new ActionListener(){

    public void actionPerformed(ActionEvent ae){try{

    int valeur = Integer.parseInt(vue2.getValeur().getTe xt());ControleVue2.this.nombre.setValeur(valeur);

    }catch(NumberFormatException nfe){}

    }});

    }}

    Une nouvelle vue engendre ici une nouvelle classe de contrle, critiques ?Faire autrement ? mieux ?

  • Swing_MVC72

    Deux nombres 4 vues, 4 Contrles

    public class MainNombreMVC{

    public static void main(String[] args){Nombre nombre = new Nombre(0,10); // le modleVue1 vue1 = new Vue1(nombre); ControleVue1 controle1 = new ControleVue1(nombre, v ue1);Vue2 vue2 = new Vue2(nombre); ControleVue2 controle2 = new ControleVue2(nombre, v ue2);Vue1 vue11 = new Vue1(nombre);ControleVue1 controle11 = new ControleVue1(nombre, vue11);

    Nombre nombreBis = new Nombre(0,100); Vue1 vueBis = new Vue1(nombreBis); ControleVue1 controle = new ControleVue1(nombreBis, vueBis);

    }}

    Dmonstration

    Un dernier exemple : deux nombres 8 vues, 25 Contrles, non merci

  • Swing_MVC73

    Discussion / lexemple

    Remarquons que : View Selection Est absent de lexemple

  • Swing_MVC74

    Discussion sur limplmentation du Modle

    public class Nombre

    Le Modle est une classe Cette classe hrite de java.util.Observable sur cet exemple

    Ce modle peut devenir un composant logiciel Un JavaBean

    Peu de diffrences part quelques rgles dcritur es Ces rgles permettront une utilisation de ce compos ant par des outils, Vers une meilleure rutilisation ? Vers une industrie du composant logiciels ?

    EJB ? Enterprise JavaBeans

    Un nouveau langage au dessus de Java?

  • Swing_MVC75

    Observable/Observer la mode JavaBeans

    Paquetage java.beans

    Champs dinstance int valeur comme property

    Observer comme PropertyChangeListener public void update (Observable obs, Object o)comme public void propertyChange (PropertyChangeEvent evt)

    Observable comme PropertyChangeSupport void notifyObservers (Object o)comme void firePropertyChange (String property,Object oldValue,Object newValue)

  • Swing_MVC76

    Un bean

    Un Bean est avant tout une classe Un bean est un (extends) POJO, une classe quelconque

    Avec

    Le respect de certaines conventions implements Serializable Un constructeur par dfaut Un getter et/ou un setter pour chaque variable dinstance firePropertyChange au sein du setter

    Simple nest-ce pas ?

    La suite Nombre devient Bean La BeanBox, loutil dassemblage de Beans : un outil historique Introspection systmatique

  • Swing_MVC77

    La classe Nombre devient Bean : NombreBeanpublic class NombreBean implements Serializable {

    public final int VALEUR_MIN;public final int VALEUR_MAX;private int valeur;private PropertyChangeSupport propertySupport;

    public NombreBean(){this.VALEUR_MIN = this.valeur = 0;this.VALEUR_MAX = 10;this.propertySupport = new PropertyChangeSupport(thi s);

    }

    public void inc(){if(valeur < VALEUR_MAX){

    int old = valeur;this.valeur++;propertySupport.firePropertyChange("valeur",old,val eur);

    }}

    public void addPropertyChangeListener(PropertyChange Listener l) {propertySupport.addPropertyChangeListener(l);

    }// public int getValeur() et setValeur()

  • Swing_MVC78

    La Vue est lcoute de son Bean

    public class Vue1Bean extends JFrame implements PropertyChangeListener{

    private JButton plus;private JButton moins;private JTextField valeur;private JSlider jauge;

    public Vue1Bean(NombreBean nombre) {super("Vue1 Nombre");nombre.addPropertyChangeListener(this);

    // Le dessin ici}

    @Overridepublic void propertyChange(PropertyChangeEvent evt){

    assert evt.getPropertyName().equals("valeur");this.valeur.setText(evt.getNewValue().toString());this.jauge.setValue((Integer)evt.getNewValue());

    }

    Les contrles ne changent pas, le MVC reste en lt at

  • Swing_MVC79

    NombreBean intgre la BeanBox

    Ajout par loutil BeanBox dun listener (EventMonitor ) chaque changement de valeur de valeur

    dmonstration pour lhistoire cest un outil du si cle dernier

    Usage de lintrospection

    setValeurgetValeur

  • Swing_MVC80

    Dmonstration

    Deux instances de NombreBean Un jongleur

    La premire instance de NombreBean loccurrence dun changement de valeur demande au jongleur darrter de

    jongler La seconde instance de NombreBean

    loccurrence dun changement de valeur demande au jongleur de jongler

  • Swing_MVC81

    Le squelette dun source de Bean, gnr par netBeans explication

    public class SimpleBean extends JLabel implements Serializable {public SimpleBean() {

    setText( "Hello world!" );propertySupport = new PropertyChangeSupport(this);

    }

    public static final String PROP_SAMPLE_PROPERTY = "sampleProperty";

    private String sampleProperty ;private PropertyChangeSupport propertySupport;

    // recherche de cette mthode par un outil, par introspectionpublic String getSampleProperty () { return sampleProperty;}

    // recherche de cette mthode par un outil, par introspectionpublic void setSampleProperty(String value) {

    String oldValue = sampleProperty;sampleProperty = value;propertySupport.firePropertyChange(PROP_SAMPLE_PROP ERTY,

    oldValue, sampleProperty);}

    // recherche de cette mthode par un outil, par introspectionpublic void addPropertyChangeListener(PropertyChangeListener listener) {

    propertySupport.addPropertyChangeListener(listener) ;}}

  • Swing_MVC82

    Usage de lintrospection

    Affecter la proprit dun bean

    Object obj une instanceString name le nom de la propritint value la nouvelle valeur

    public void setProperty(Object obj, String name, int value) { String prop = Character.toUpperCase(name.charAt(0)) + name.substring(1);

    String mname = "set" + prop;

    Class[] types = new Class[] { int.class };

    Method method = obj.getClass().getMethod(mname, types);

    method.invoke(obj, new Object[] { value });

    }

  • Swing_MVC83

    MVC un autre schma, encore !, tjs daccord ?

    src : Mastering JSF page 6

  • Swing_MVC84

    Conclusion ? discussion

    MVC au niveau dune application

    Et Il y a aussi un MVC au niveau de chaque composan t swing

  • Swing_MVC85

    Conclusion, discussion

    MVC Mature

    La suite

    MVC et composant swing Certains composants proposent de changer le modle et lIHM

  • Swing_MVC86

    Un Composant Swing et MVC

    Par exemple JTextField

    Une zone de texte (classe JTextComponent)

    Le Modle Le texte (classe PlainDocument)

    Linterface Utilisateur Un rectangle (classe BasicTextFieldUI )

    En standard JTextField field = new JTextField();

    Avec un autre modle JTextField field = new JTextField (new unAutreModleDe Document());

    Avec une autre interface utilisateur (vue) field.setUI(new uneAutreInterface());

  • Swing_MVC87

    Un exemple, avec dmo possible

    Le nouveau JTextField ne peut contenir que des maju scules ! Une contrainte sur une entre du formulaire

    Un nouveau modle, ici une sous-classe de Document this.userIdField = new JTextField(new UnAutreModleDeTexte(), "", 10);

    public class UnAutreModleDeTexte extends PlainDocume nt {public void insertString(int offs, String str, Attrib uteSet a)

    throws BadLocationException {if (str == null) {

    return;}char[] upper = str.toCharArray();for (int i = 0; i < upper.length; i++) {

    upper[i] = Character.toUpperCase(upper[i]);}super.insertString(offs, new String(upper), a);

    }}

  • Swing_MVC88

    Donc nous avons MVC et SMA

    SMA : Separable Model Architecture

    ou bien

  • Swing_MVC89

    Envoi dun vnement lors dun changement dtat

    Lecture de ltat du modle

    SMA

  • Swing_MVC90

    Component Model Interface Model Type

    JButton ButtonModel GUI

    JToggleButton ButtonModel GUI/data

    JCheckBox ButtonModel GUI/data

    JRadioButton ButtonModel GUI/data

    JMenu ButtonModel GUI

    JMenuItem ButtonModel GUI

    JCheckBoxMenuItem ButtonModel GUI/data

    JRadioButtonMenuItem ButtonModel GUI/data

    JComboBox ComboBoxModel data

    JProgressBar BoundedRangeModel GUI/data

    JScrollBar BoundedRangeModel GUI/data

    JSlider BoundedRangeModel GUI/data

    JTabbedPane SingleSelectionModel GUI

    JList ListModel data

    JList ListSelectionModel GUI

    JTable TableModel data

    JTable TableColumnModel GUI

    JTree TreeModel data

    JTree TreeSelectionModel GUI

    JEditorPane Document data

    JTextPane Document data

    JTextArea Document data

    JTextField Document data

    JPasswordField Document data

  • Swing_MVC91

    Model et NotificationModel Listener Event

    ListModel ListDataListener ListDataEvent

    ListSelectionModel ListSelectionListener ListSelectionEvent

    ComboBoxModel ListDataListener ListDataEvent

    TreeModel TreeModelListener TreeModelEvent

    TreeSelectionModel TreeSelectionListener TreeSelectionEvent

    TableModel TableModelListener TableModelEvent

    TableColumnModel TableColumnModel-

    Listener

    TableColumnModel-

    Event

    Document DocumentListener DocumentEvent

    Document UndoableEditListener UndoableEditEvent

  • Swing_MVC92

    Jlist and ListModelexemple fourni.. suivre

  • Swing_MVC93

    JL ist

    JList()setC ellRenderer()setModel()

    JC om ponentC om ponentU I

    # ui

    L istU I

    ListD ataEvent

    getType()getIndex0()getIndex1()ListD ataEvent()

    BasicListUI

    # list

    ListModel

    g etS ize ()g etE le me ntAt()a dd ListD a taL istene r()rem oveL istD ata Liste ner()

    -da taM od el

    AbstractListM odel

    addListD ataListener(l : L istD ataListener) : voidremoveListD ataListener(l : L istD ataListener) : voidfireC ontentsC hanged(source : Object, index0 : int, index1 : int) : voidfireIntervalAdded(source : Object, index0 : int, index1 : int) : voidfireIntervalRemoved(source : Object, index0 : int, index1 : int) : voidgetListeners(listenerType : C lass) : EventListener[]

    L istD ataListener

    intervalAdded(e : L istD ataEvent) : voidintervalRemoved(e : L istD ataEvent) : voidcontentsC hanged(e : L istD ataEvent) : void

    #listD ataListener

    0..*0..*

  • Swing_MVC94

    ListD ataListener

    TableModelEventD ELETE : int = - 1INSERT : int = 1UPD ATE : int = 0

    getC olumn()getF irstRow()getLastRow()getType()

    Tab le Mo de l

    getRowC ount()getC olumnC ount()getC olumnName()getC olumnC lass()isC ellEditable()getValueA t()setValueA t()addTableModelListener()removeTableModelListener()

    AbstractTableM odel

    getC olumnName(column : int) : S tringfindC olumn(columnName : S tring) : intgetC olumnC lass(columnIndex : int) : C lassisC ellEditable(rowIndex : int, columnIndex : int) : booleansetValueA t(aValue : Object, rowIndex : int, columnIndex : int) : voidaddTableModelListener(l : TableModelListener) : voidremoveTableModelListener(l : TableModelListener) : voidfireTableD ataC hanged() : voidfireTableS tructureC hanged() : voidfireTableRowsInserted(firstRow : int, lastRow : int) : voidfireTableRowsUpdated(firstRow : int, lastRow : int) : voidfireTableRowsD eleted(firstRow : int, lastRow : int) : voidfireTableC ellUpdated(row : int, column : int) : voidfireTableC hanged(e : TableModelEvent) : voidgetListeners(listenerType : C lass) : EventListener[]

    TableModelListener

    ta bleC ha nged(e : TableModelEvent) : void

    0..*0..*

    TableU I

    JC o m po ne nt

    C o m po ne ntU I#ui

    BasicTableUI

    JTable#dataModel#table

  • Swing_MVC95

    Pause la suite

    MVC Web

    JSF Framework pour applications web MVC web Configuration en fichier xml Mise en place dun JavaBean adaptateur si ncessaire Critiques

    JSF-2 Ajax @Annotations Appel de JavaBean avec source ou non Critiques