helloworld:design_pattern:mvc:java:swing
Table des matières
Cette page nécessite de connaître Swing.
Schéma MVC
Structurez mieux votre code avec le pattern MVC 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 JSP.
- Observable
package com.llgc.modele; public interface Observable { public void addObserver(Observer obs); public void removeObservers(); public void notifyObserver(String str); }
L'interface Observer
et la classe Observable
existe en Java. Il est plutôt recommandé de les utiliser directement.
- ModeleVoitureSwing.java
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<Observer> listObserver = new ArrayList<Observer>(); @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
- CtrlSwing.java
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); } }
helloworld/design_pattern/mvc/java/swing.txt · Dernière modification : 2020/05/10 23:51 de root