Le pattern Modele Vue Controle
Le pattern Observer-Observable est appliqué à la visualisation :
Source de ModeleListeMots.java
import java.util.*;
/** modele de la liste de mots ordonnes sans doublon<br>
* est observable
*/
public class ModeleListeMots extends Observable
{
/** vecteur gerant la liste */
private Vector vect;
/** constructeur sans parametre */
public ModeleListeMots() {
vect = new Vector();
}
/** constructeur a partir d'un tableau de mots */
public ModeleListeMots(String[]mots) {
Arrays.sort(mots);
int max = mots.length;
vect = new Vector(max);
for (int i=0; i<max; i++)
vect.add(mots[i]);
}
/** ajoute un mot s'il n'existe pas */
public void add(String mot) {
if (!vect.contains(mot)) {
int max = vect.size();
int i=0;
while ((i<max) && (mot.compareTo((String)vect.get(i)) >0))
i++ ;
vect.add(i, mot);
this.setChanged();
this.notifyObservers(this.toArray());
}
}
/** fournit une copie tableau */
public String[] toArray() {
int max = vect.size();
String[]result = new String[max] ;
for (int i=0; i<max; i++)
result[i]=(String)vect.get(i);
return result;
}
/** supprime un mot s'il existe */
public void remove(String mot) {
if (vect.remove(mot)) {
this.setChanged();
this.notifyObservers(this.toArray());
}
}
}
|
Source de ControleurConsole.java
/** un controleur utilisant la console */
public class ControleurConsole
{
/** le modele a controler */
private ModeleListeMots modele;
/** constructeur */
public ControleurConsole(ModeleListeMots modele) {
this.modele = modele;
}
/** la boucle de controle des commandes */
public void run() {
String rep;
boolean encore;
do {
rep = Clavier.lireLigne().trim();
encore = this.operer(rep);
} while (encore);
}
/** analyse et traitement des commandes :<br>
* add mot ajoute un mot a la liste<br>
* del mot supprime un mot a la liste<br>
* q pour quitter
*/
private boolean operer(String control) {
boolean continuer = true;
if (control == null)
return continuer;
else if (control.indexOf("del ") == 0) {
String mot = control.substring(4,control.length()).trim();
if (mot != null)
this.modele.remove(mot);
} else if (control.indexOf("add ") == 0) {
String mot = control.substring(4,control.length()).trim();
if (mot != null)
this.modele.add(mot);
} else if (control.equals("q"))
continuer = false;
return continuer;
}
}
|
Source de ControleurGraphik.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/** un controleur swing */
public class ControleurGraphik extends JPanel implements ActionListener
{
/** le modele a controler */
private ModeleListeMots modele;
/** pour saisir un mot */
private JTextField motField = null;
/** constructeur */
public ControleurGraphik(ModeleListeMots modele) {
super(new BorderLayout());
this.modele = modele;
motField = new JTextField("");
JButton addButton = new JButton("Add");
addButton.addActionListener(this);
JButton delButton = new JButton("Del");
delButton.addActionListener(this);
this.add(motField, BorderLayout.CENTER);
this.add(addButton, BorderLayout.NORTH);
this.add(delButton, BorderLayout.SOUTH);
}
/** action des boutons add et del */
public void actionPerformed(ActionEvent e){
if (e.getActionCommand().equals("Add")) {
this.modele.add(motField.getText().trim());
motField.setText("");
} else if (e.getActionCommand().equals("Del")) {
this.modele.remove(motField.getText().trim());
motField.setText("");
}
}
}
|
Source de VueConsole.java
import java.util.*;
/** vue de la liste par affichage sur l'ecran<br>
* observe le modele
*/
public class VueConsole implements Observer
{
/** le modele a afficher */
private ModeleListeMots modele;
/** constructeur */
public VueConsole() {
modele = null;
}
/** affecter un modele pour la vue console */
public void setModele(ModeleListeMots modele) {
this.modele = modele;
modele.addObserver(this);
this.miseAJour(modele.toArray());
}
/** mise a jour de la vue console */
public void miseAJour(String[] listeMots) {
if ((modele!= null) && (listeMots != null)) {
System.out.println("----------");
int max = listeMots.length;
for (int i=0; i<max; i++)
System.out.println(listeMots[i]);
System.out.println("----------");
}
}
/** recoit une notification de changement du modele observe */
public void update(Observable source, Object donnees) {
if ((source instanceof ModeleListeMots) && (donnees != null)
&& (donnees instanceof String[]))
this.miseAJour((String[])donnees);
}
}
|
Source de VueGraphik.java
import java.util.*;
import javax.swing.*;
/** vue de la liste par affichage swing<br>
* observe le modele
*/
public class VueGraphik extends JScrollPane implements Observer
{
/** le modele a afficher */
private ModeleListeMots modele;
/** le label d'affichage */
private JLabel labelList = null;
/** constructeur */
public VueGraphik() {
super();
modele = null;
labelList = new JLabel("");
this.setViewportView(labelList);
}
/** affecter un modele pour la vue */
public void setModele(ModeleListeMots modele) {
this.modele = modele;
modele.addObserver(this);
this.miseAJour(modele.toArray());
}
/** mise a jour de la vue */
public void miseAJour(String[] listeMots) {
if ((modele!= null) && (listeMots != null)) {
StringBuffer lab = new StringBuffer("<html>");
if (listeMots.length > 0) {
int n = listeMots.length-1;
for (int i=0; i<n; i++)
lab.append(listeMots[i]+"<br>");
lab.append(listeMots[n]);
}
lab.append("</html>");
// labelList.setText(lab.toString()); risque de deadlock
final String texte = lab.toString();
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
labelList.setText(texte);
}
});
}
}
/** recoit une notification de changement du modele observe */
public void update(Observable source, Object donnees) {
if ((source instanceof ModeleListeMots) && (donnees != null)
&& (donnees instanceof String[]))
this.miseAJour((String[])donnees);
}
}
|
Source de MVC.java
import javax.swing.*;
/** le MVC de gestion d'une liste de mots ordonnes */
public class MVC {
public static void main(String[] args) {
ModeleListeMots modele = new ModeleListeMots(args);
ControleurConsole controlCon = new ControleurConsole(modele);
ControleurGraphik controlGra = new ControleurGraphik(modele);
VueConsole vueCon = new VueConsole();
VueGraphik vueGra = new VueGraphik();
JFrame frame = new JFrame("vue graphique");
JPanel panel = new JPanel();
panel.add(controlGra);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
panel, vueGra);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(0.5);
frame.getContentPane().add(splitPane);
frame.setSize(200,100);
frame.setVisible(true);
vueCon.setModele(modele);
vueGra.setModele(modele);
controlCon.run();
frame.dispose();
}
}
|