mvc swing intro jsf
DESCRIPTION
JAVA J2EETRANSCRIPT
-
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