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);
}
}