Outils pour utilisateurs

Outils du site


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

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