Cette page nécessite de connaître [[lang:java:gui:swing|Swing]]. =====Schéma MVC===== {{:helloworld:design_pattern:mvc:java:swing:399354.png|}} [[https://openclassrooms.com/courses/apprenez-a-programmer-en-java/mieux-structurer-son-code-le-pattern-mvc|Structurez mieux votre code avec le pattern MVC]] {{ :helloworld:design_pattern:mvc:java:swing:structurez_mieux_votre_code_avec_le_pattern_mvc_-_apprenez_a_programmer_en_java_-_openclassrooms_2020-04-26_12_17_56_am_.html |Archive du 18/03/2020 le 27/04/2020}} Contrairement aux JSP/JSF, la modification du modèle ne permet pas de générer automatiquement la vue. Il est donc nécessaire d'utiliser le Pattern de l'observateur/observable pour que le modèle puisse communiquer avec la vue. ====Modèle==== Le modèle de Swing dérive de celui des [[helloworld:design_pattern:mvc:java:jsp#Modele|JSP]]. package com.llgc.modele; public interface Observable { public void addObserver(Observer obs); public void removeObservers(); public void notifyObserver(String str); } package com.llgc.modele; public interface Observer { public void update(String str); } L'interface ''Observer'' et la classe ''Observable'' existe en Java. Il est plutôt recommandé de les utiliser directement. package com.llgc.modele; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.llgc.modele.pojo.POJOVoiture; public class ModeleVoitureSwing extends ModeleVoiture implements Observable { private List listObserver = new ArrayList(); @Override public void addObserver(Observer obs) { listObserver.add(obs); } @Override public void removeObservers() { listObserver.clear(); } @Override public void notifyObserver(String str) { for (Observer obs : listObserver) obs.update(str); } @Override public void create(POJOVoiture entite) { try { super.create(entite); } catch (ClassNotFoundException | SQLException e) { notifyObserver("Echec lors de l'insertion de la voiture dans la base de données."); return; } notifyObserver("Ajouter avec succès."); } } ====Controleur==== package com.llgc.controleur; import com.llgc.modele.ModeleVoitureSwing; import com.llgc.modele.pojo.POJOVoiture; public class CtrlSwing { private ModeleVoitureSwing modele; public void ajoutVoiture(String nom, String poids, String marque) { POJOVoiture voiture = new POJOVoiture(); voiture.setMarque(marque); voiture.setNom(nom); try { voiture.setPoids(Integer.parseInt(poids)); } catch (NumberFormatException e) { modele.notifyObserver("Impossible d'ajouter une voiture. " + poids + " n'est pas un nombre valide."); return; } modele.create(voiture); } public CtrlSwing(ModeleVoitureSwing modele) { super(); this.modele = modele; } } ====Vue==== Avec la méthode ''main'' qui peut s'extraire dans une classe indépendante. package com.llgc.vue; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import com.llgc.controleur.CtrlSwing; import com.llgc.modele.ModeleVoitureSwing; import com.llgc.modele.Observer; @SuppressWarnings("serial") public class VueSwing extends JFrame implements Observer { private JTextField nom; private JTextField poids; private JTextField marque; private CtrlSwing ctrl; public static void main(String[] args) { ModeleVoitureSwing modele = new ModeleVoitureSwing(); CtrlSwing ctrl = new CtrlSwing(modele); VueSwing vue = new VueSwing(ctrl); modele.addObserver(vue); } public VueSwing(CtrlSwing ctrl) { this.ctrl = ctrl; setTitle("Bonjour"); // addWindowListener (new ActionClose()); setDefaultCloseOperation(DISPOSE_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); // Le add place les // composants les uns à la suite des autres plutôt que les uns sur les // autres. JPanel pnlSouth = new JPanel(new GridLayout(0, 2, 12, 12)); pnlSouth.setDoubleBuffered(true); JLabel lbl = new JLabel("Nom"); lbl.setHorizontalAlignment(SwingConstants.CENTER); pnlSouth.add(lbl, BorderLayout.CENTER); nom = new JTextField(25); pnlSouth.add(nom, BorderLayout.CENTER); lbl = new JLabel("Poids"); lbl.setHorizontalAlignment(SwingConstants.CENTER); pnlSouth.add(lbl, BorderLayout.CENTER); poids = new JTextField(25); pnlSouth.add(poids, BorderLayout.CENTER); lbl = new JLabel("Marque"); lbl.setHorizontalAlignment(SwingConstants.CENTER); pnlSouth.add(lbl, BorderLayout.CENTER); marque = new JTextField(25); pnlSouth.add(marque, BorderLayout.CENTER); JPanel pnl2 = new JPanel(); // pnl2.setSize (new Dimension (500, 500)); // pnlSouth.setSize (new Dimension (500, 500)); pnl2.add(pnlSouth, BorderLayout.CENTER); getContentPane().add(pnl2, BorderLayout.CENTER); JButton button1 = new JButton(new ActionClose("Fermer")); JButton button2 = new JButton(new ActionAjouter("Ajouter")); pnlSouth.add(button1, BorderLayout.CENTER); pnlSouth.add(button2, BorderLayout.CENTER); // setSize (280, 100); pack(); setVisible(true); } private class ActionClose extends AbstractAction { public ActionClose(String name) { super(name); } @Override public void actionPerformed(ActionEvent arg0) { dispose(); } } private class ActionAjouter extends AbstractAction { public ActionAjouter(String name) { super(name); } @Override public void actionPerformed(ActionEvent arg0) { ctrl.ajoutVoiture(nom.getText(), poids.getText(), marque.getText()); } } @Override public void update(String str) { JOptionPane.showMessageDialog(this, str); } }