/*
* Created on 5 juin 2006
*/
package org.gibus.macge;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* Les classes ont toutes ?t? plac?es dans le m?me fichier pour plus de commodit? ? l'upload sur le forum.
*
* @author GrandGibus
* copyrights MacG?n?ration
*/
public class DemoDocumentVue {
/**
* Le mod?le... l'?pine dorsale de ton projet. C'est lui qui repr?sente les donn?es de ton programme.
* Celui-ci ne pr?sente aucune fonction m?tier... c'est un POJO.
* A noter qu'on peut ?galement utilser les fonctions des Beans et leurs propriet?s au lieu de Observable ;-)
* @author GrandGibus
*
*/
private static class MonModele extends Observable {
private String nom;
private int age;
public MonModele(String nom, int age) {
this.nom = nom;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
setChanged();
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
setChanged();
}
}
/**
* La classe se met automatiquement ? jour sur les notifications du mod?le qu'elle ?coute.<br />
* Ce n'est pas elle qui a la responsabilit? d'?diter le mod?le: c'est le travail du controlleur
* @author GrandGibus
*/
private static class MonPanel1 extends JPanel implements Observer {
private JTextField tfNom;
private JTextField tfAge;
private JButton btnUpdate;
public MonPanel1() {
initLayout();
}
private void initLayout() {
this.setBorder(BorderFactory.createTitledBorder("Mon Panel1"));
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(7, 7, 7, 7);
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.NONE;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0;
gbc.weighty = 0;
this.add(new JLabel("Nom :"), gbc);
gbc.gridy++;
this.add(new JLabel("Age :"), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
tfNom = new JTextField(30);
this.add(tfNom, gbc);
gbc.gridy++;
tfAge = new JTextField(3);
this.add(tfAge, gbc);
gbc.gridx = 2;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 2;
gbc.weightx = 0;
gbc.weighty = 1;
btnUpdate = new JButton("Mise ? jour");
this.add(btnUpdate, gbc);
}
public void update(Observable o, Object arg) {
if (o != null && o instanceof MonModele) {
MonModele m = (MonModele)o;
this.tfNom.setText(m.getNom());
this.tfAge.setText(Integer.toString(m.getAge()));
}
}
public JButton getBtnUpdate() {
return btnUpdate;
}
public String getNomEdite() {
return tfNom.getText();
}
public int getAgeEdite() {
return Integer.parseInt(tfAge.getText());
}
}
/**
* La vue est branch?e sur le mod?le <em>depuis l'ext?rieur</em>.
* A noter que la vue ne stocke ni le mod?le, ni le controlleur, ni d'autres vues.
* @author GrandGibus
*/
private static class MonPanel2 extends JPanel implements Observer {
private JLabel lblAge;
private JButton btnEffacer;
public MonPanel2() {
initLayout();
}
private void initLayout() {
this.setLayout(new BorderLayout());
this.setBorder(BorderFactory.createTitledBorder("Mon Panel2"));
lblAge = new JLabel();
this.add(lblAge, BorderLayout.NORTH);
btnEffacer= new JButton("Effacer");
this.add(btnEffacer, BorderLayout.SOUTH);
}
public void update(Observable o, Object arg) {
if (o != null && o instanceof MonModele) {
MonModele m = (MonModele)o;
StringBuffer sb = new StringBuffer();
if (m.getAge() > 0) {
sb.append("Mr ");
sb.append(m.getNom());
sb.append(" est ag? de ");
sb.append(m.getAge());
sb.append(" ans.");
}
this.lblAge.setText(sb.toString());
}
}
public JButton getBtnEffacer() {
return btnEffacer;
}
}
/**
* Le controlleur a pour but de relier la vue et le mod?le. C'est lui (et pas la vue) qui prend
* l'initiative de modifier le mod?le.
*
* @author GrandGibus
*
*/
public static class MonControlleur {
public static void initController(final MonPanel1 pnl, final MonModele mdl) {
pnl.getBtnUpdate().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mdl.setNom(pnl.getNomEdite());
mdl.setAge(pnl.getAgeEdite());
mdl.notifyObservers();
}
});
}
public static void initContorller(final MonPanel2 pnl, final MonModele mdl) {
pnl.getBtnEffacer().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mdl.setAge(0);
mdl.setNom("");
mdl.notifyObservers();
}
});
}
}
/**
* L'ossature du programme:
* <ol>
* <li>on cr?e le mod?le</li>
* <li>on cr?e les 2 vues associ?es</li>
* <li>on met le controlleur en place</li>
* </ol>
* Les 2 frames sont affich?es.
* @param args
*/
public static void main(String[] args) {
MonModele modele = new MonModele("", 0);
MonPanel1 pnl1 = new MonPanel1();
modele.addObserver(pnl1);
MonControlleur.initController(pnl1, modele);
MonPanel2 pnl2 = new MonPanel2();
modele.addObserver(pnl2);
MonControlleur.initContorller(pnl2, modele);
// modele init
modele.setNom("");
modele.setAge(0);
modele.notifyObservers();
JFrame frm = new JFrame("MVC D?mo for macg? 1");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.getContentPane().add(pnl1);
frm.pack();
frm.show();
frm = new JFrame("MVC D?mo for macg? 2");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.getContentPane().add(pnl2);
frm.pack();
frm.show();
}
}