MVC Avec Java

Embed Size (px)

Citation preview

Programmation vnementielleLicence 3 MIAGeFrdrique Carrre ([email protected]) / Pascal Ferraro ([email protected])

Programmation vnementielle p.1

MVC Design PatternModle de Conception "Model-View-Controller" principe: sparer lapplication en trois parties le Modle, la Vue et le Contrleur les parties Vue + Contrleur constituent le "GUI", ("Graphical User Interface") consquence: une sparation claire de linterface graphique ("Vue" + "Contrleur") de lapplication et du code proprement dit (le "Modle") un modle peut avoir plusieurs vues diffrentes

Programmation vnementielle p.2

MVC: le principe

Programmation vnementielle p.3

MVC: les avantagesmodularit: permet de dvelopper sparment le code et linterface graphique facilit de maintenance: le modle rassemble toutes les fonctionnalits de lapplication, les vues sont indpendantes entre elles extensibilit par lajout de vues avec leurs contrleurs partages des donnes par les diffrentes vues, qui ragissent simultanment aux changements

Programmation vnementielle p.4

Cas des composants SwingSwing est bas sur le modle MVC: tout composant Swing dispose dun Model (ex: ButtonModel) tout composant Swing dispose dun UI (ex: ButtonUI) qui gre lapparence ("look and feel")

Programmation vnementielle p.5

Le Rle du Modlerassemble les diffrentes fonctionnalits de lapplication, sans se soucier des apparences comporte des mthodes permettant lutilisateur davoir des renseignements sur ltat du programme comporte des mthodes permettant de modier ltat du programme doit "enregistrer" toutes ses vues pour pouvoir les notier lors dun changement dtat. comporte des mthodes de "notication" des vues ("notifyXXX(), "reXXXChanged(),...)

Programmation vnementielle p.6

Le Rle de la (ou les) Vue(s)gre laspect graphique de lapplication une mme application peut disposer de plusieurs vues, donc de plusieurs reprsentations graphiques si lutilisateur interagit avec une vue, la vue informe le contrleur des changements dsirs.

Programmation vnementielle p.7

Le Rle des contrleursles contrleurs sont associs aux vues si lutilisateur interagit avec une vue, le contrleur appelle des mthodes de changement dtat du modle le modle notiera alors TOUTES les vues concernes par le changement dtat, an quelles se mettent jour

Programmation vnementielle p.8

Schma de fonctionnementLe modle encapsule ltat de lapplication rpond aux requetes concernant ltat expose les fonctionnalits de lapplication notifie les vues de tout changement

requetes sur ltat

changement dtat

La vue

notifications des changements

le controleur gre le comportement de lapplication transforme les actions de lutilisateur en mise jour du modle selectionne les vues pour les rponses un par fonctionnalit

gre lapparence requiert des misesjour selection de la vue du modle envoie les modifications de actions de lutilisateur lutilisateur au controleur permet au controleur de selectionner la vue

Programmation vnementielle p.9

MVC en JAVAPour crer vos propres modles en JAVA, vous pouvez utiliser java.util.Observable et java.util.Observer le Modle pourra hriter de la classe Observable: void addObserver(Observer o) // pour ajouter une vue protected void setChanged() // marque le modle comme ayant subi un changement void notifyObservers() // pour indiquer un changement aux vues les vues devront alors implmenter linterface Observer: void update(Observable o, Object arg) // code de mise--jour de la vue quand lobjet observ a chang

Programmation vnementielle p.10

Exempleimport java.util.*; public class TemperatureModel extends Observable{ public double getF(){ return temperatureF; } public double getC(){ return (temperatureF - 32.0) * 5.0 / 9.0; } public void setF(double tempF){ temperatureF = tempF; setChanged(); notifyObservers(); \\ call the update() of all observers } public void setC(double tempC){ temperatureF = tempC*9.0/5.0 + 32.0; setChanged(); notifyObservers(); \\ call the update() of all observers } private double temperatureF = 32.0; }

Programmation vnementielle p.11

Exemple (suite)public class SliderGUI implements Observer{ public SliderGUI(TemperatureModel m, int h, int v){ m.addObserver(this); //Observe the temperature model model = m; sliderFrame.getContentPane().add(tempControl); tempControl.addAdjustmentListener(new SlideListener()); ... } \\ Called from the model to update the view public void update(Observable t, Object o){ double temp = ((TemperatureModel) t).getC(); \\ Get the new state tempControl.setValue((int) temp); // Move the slider thumb } class SlideListener implements AdjustmentListener{ public void adjustmentValueChanged(AdjustmentEvent e){ model.setC(tempControl.getValue()); \\ require the model to change } }

private JScrollBar tempControl = new JScrollBar(JScrollBar.HORIZONTAL, 0, 10, private TemperatureModel model = null; private JFrame sliderFrame = new JFrame("Celsius"); }

Programmation vnementielle p.12

Construire une tableune JTable afche des donnes dans un tableau un TableModel rgit la gestion des donnes on peut utiliser implicitement le DefaultTableModel, et fournir simplement deux tableaux dans la JTable: Object[][] data contenant les donnes String[] columnNames contenant les enttes des colonnes Un tableau est entour dascenseurs, en gnral: JScrollPane scrollPane = new JScrollPane(table);

Programmation vnementielle p.13

Utiliser les modlesPour sparer la gestion des donnes de la gestion de lapparence, il vaut mieux tendre la classe abstraite AbstractTableModel. Pour grer la slection de lignes de la table, on utilisera un modle de slection du type ListSelectionModel Pour grer de manire identique toutes les cellules dune colonne, on utilisera un modle de colonnes. il existe un modle de slection et un modle de colonnes fournis par dfault: DefaultListSelectionModel et DefaultTableColumnModel

Programmation vnementielle p.14

Construire une tableLes constructeurs sontJTable() modles par dfaut pour les trois modles JTable(int numRows, int numColumns) avec autant de cellules vides JTable(Object[][] rowData, Object[] columnNames) avec les valeurs des cellules de rowData et noms de colonnes columnNames. JTable(TableModel dm) avec le modle de donnes dm, les autres par dfaut JTable(TableModel dm, TableColumnModel cm) avec modle de donnes et modle de colonnes fournis.

JTable(TableModel dm, TableColumnModel cm, ListSelectio Les trois modles sont fournis.

JTable(Vector rowData, Vector columnNames) ici, les donnes sont fournies par lignes, sous forme de vecteurs.Programmation vnementielle p.15

Modle de tableLes donnes sont accessible par un modle. Elles peuvent tre stockes ou calcules, de faon transparente. La classe AbstractTableModel implmente les mthodes dun modle de table, sauf - public int getRowCount() - public int getColumnCount() - public object getValueAt(int ligne, int colonne) qui retournent respectivement - le nombre de lignes - le nombre de colonnes - lobjet afcher dans les ligne et colonne indiques (sa mthode toString est utilise).

Programmation vnementielle p.16

Un Premier ExempleEn plus des trois mthodes obliges, la fonction getColumClass a t rednie, ce qui produit la justication droiteclass SimpleTable extends JPanel { SimpleTable() { setLayout(new BorderLayout()); TableModel dataModel = new AbstractTableModel() { public int getColumnCount() { return 10; } public int getRowCount() { return 10;} public Object getValueAt(int row, int col) { return new Integer((1+row)*(1+col)); } public Class getColumnClass(int column) { return Number.class; } }; JTable table = new JTable(dataModel); add(new JScrollPane(table)); } }

Programmation vnementielle p.17

une table simple

Programmation vnementielle p.18

Un deuxime ExempleCration du modle de table TableModel model = new ModelInvestment(30, 5, 10); JTable table = new JTable(model); Notre modle de table hrite du modle abstrait: class ModelInvestment extends AbstractTableModel {...} Mthodes implmenter (getColumnName par dfaut, numrote A, B, ...): public int getRowCount() public int getColumnCount() public Object getValueAt(int ligne, int colonne) public String getColumnName(int colonne)

Programmation vnementielle p.19

Le modleclass ModelInvestment extends AbstractTableModel { private int annees; private int tauxMin; private int tauxMax; private static double depot = 100000.0; ModelInvestment(int annees, int tauxMin, int tauxMax) { this.annees = annees; this.tauxMin = tauxMin; this.tauxMax = tauxMax; } public int getRowCount() { return annees;} public int getColumnCount() { return tauxMax - tauxMin + 1;} public Object getValueAt(int ligne, int colonne) { double taux = (colonne + tauxMin) / 100.0; double depotFinal = depot * Math.pow(1 + taux, ligne); return NumberFormat.getCurrencyInstance().format(depotFinal); } public String getColumnName(int colonne) { double taux = (colonne + tauxMin) / 100.0; return NumberFormat.getPercentInstance().format(taux); } }

Programmation vnementielle p.20

une autre table simple

Programmation vnementielle p.21

Un troisime exempleclass MyTableModel extends AbstractTableModel { private String[] columnNames = {"First Name","Last Name","Sport", "# of Years","Vegetarian"}; private Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)}, {"Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true)}, {"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)} }; public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return columnNames[col]; } ...

Programmation vnementielle p.22

Un troisime exemple (suite)public Object getValueAt(int row, int col) { return data[row][col]; } /* to determine the default renderer for each cell public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } */

/* if some cells are editable. */ public boolean isCellEditable(int row, int col) { if (col > 2) { return true ; } } /* if some data can change. */ public void setValueAt(Object value, int row, int col) { data[row][col] = value; fireTableCellUpdated(row, col); } }

Programmation vnementielle p.23

une troisime table

Programmation vnementielle p.24

Les vnementsLa classe JTable coute les vnements reus du modle

Le modle a plusieurs mthodes pour signaler des modications de donnes : public void fireTableChanged(TableModelEvent e) public void fireTableDataChanged() public void fireTableStructureChanged() public void fireTableRowsInserted(int firstRow, int las public void fireTableRowsUpdated(int firstRow, int last public void fireTableRowsDeleted(int firstRow, int last public void fireTableCellUpdated(int row, int col) Les colonnes sont rgies par un TableColumnModel qui a ses propres noticateurs dvnements sur les colonnes

Programmation vnementielle p.25

Une autre vue lcouteimport javax.swing.event.*; import javax.swing.table.TableModel; public class MyTableModel extends AbstractTableModel{ public MyTableModel() { ... addTableModelListener(MyView); ... } } public class MyView implements TableModelListener { ... public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); ...// Do something with the data... } }

Programmation vnementielle p.26

Mthodes utilesLa mthode boolean TableModel.isCellEditable(int l, int c) doit renvoyer true si la cellule peut tre modie (par dfaut non)

La mthode public void setRowSelectionAllowed(boolean rowSelection indique si les lignes peuvent tre selectionnes dans ce modle

La mthode public void setSelectionBackground(Color selectionBackg attribue une couleur aux cellules selectionnes

Programmation vnementielle p.27