1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| public class VueCreerPersonne extends JDialog {
private final VueCreerPersonneControleur controleur;
public VueCreerPersonne(JFrame frame, VueCreerPersonneControleur controleur) {
super(frame,true);
this.controleur = controleur;
setTitle("Modifier personne");
JPanel panel = new JPanel(new GridBagLayout());
Insets insets = new Insets(2,2,2,2);
// la vue décide quelles informations elle affiche et permet de modifier
panel.add(new JLabel("Nom :"), new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.EAST,GridBagConstraints.NONE,insets,0,0));
panel.add(new JLabel("Prenom :"), new GridBagConstraints(0,1,1,1,0,0,GridBagConstraints.EAST,GridBagConstraints.NONE,insets,0,0));
JTextField nomField = new JTextField();
JTextField prenomField = new JTextField();
panel.add(nomField, new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,insets,0,0));
panel.add(prenomField, new GridBagConstraints(1,1,1,1,1,0,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,insets,0,0));
// fait le lien entre vue et controleur
register(VueCreerPersonneControleur.NOM, nomField);
register(VueCreerPersonneControleur.PRENOM, prenomField);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(panel);
JPanel buttonPanel = new JPanel();
JButton buttonReset = new JButton("Reset");
buttonReset.addActionListener(e-> controleur.reset());
buttonPanel.add(buttonReset);
JPanel okCancelPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton buttonOk = new JButton("Sauver");
buttonOk.addActionListener(e-> {
controleur.save();
VueCreerPersonne.this.dispose();
});
okCancelPanel.add(buttonOk);
buttonOk.setEnabled(false);
// le controleur propose d'autres informations que celles du modèles pour améliorer le fonctionnement de la vue (ici un état dirty=saisie non sauvegardée, un état valid=saisie valide)
controleur.add(VueCreerPersonneControleur.DIRTY, e-> {
buttonOk.setEnabled((boolean)e.getNewValue()&&controleur.isValid());
});
controleur.add(VueCreerPersonneControleur.VALID, e-> {
buttonOk.setEnabled((boolean)e.getNewValue()&&controleur.isDirty());
});
JButton buttonCancel = new JButton("Annuler");
buttonCancel.addActionListener(e-> {
VueCreerPersonne.this.close();
});
okCancelPanel.add(buttonCancel);
buttonPanel.add(okCancelPanel);
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
close(); // permet d'intercepter la fermeture par la croix
}
});
}
// fermeture du dialogue
protected void close() {
if ( controleur.isDirty() ) {
switch( JOptionPane.showConfirmDialog(VueCreerPersonne.this, "Voulez-vous enregistrer vos modifications ?")) {
case JOptionPane.OK_OPTION:
if ( !controleur.isValid() ) {
JOptionPane.showMessageDialog(VueCreerPersonne.this, "Saisie invalide");
}
else {
controleur.save();
VueCreerPersonne.this.dispose();
}
break;
case JOptionPane.NO_OPTION:
VueCreerPersonne.this.dispose();
break;
}
}
else {
VueCreerPersonne.this.dispose();
}
}
// associe le controleur et la vue
private void register(String property, JTextField field) {
PropertyChangeListener listener = controleur.add(property, p-> field.setText((String)p.getNewValue()));
field.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent arg0) {
update();
}
@Override
public void insertUpdate(DocumentEvent arg0) {
update();
}
@Override
public void changedUpdate(DocumentEvent arg0) {
update();
}
private void update() {
//SwingUtilities.invokeLater(()->
listener.propertyChange(new PropertyChangeEvent(this, property, null, field.getText()));
}
});
}
} |
Partager