Bouton annuler : pattern memento

Bouton annuler : pattern memento - Java - Programmation

Marsh Posté le 25-11-2013 à 15:34:55    

bonjour,
 
Je suis quelque peu coincé sur une utilisation d'un rollback sur une petite appli faite en java.  
J'ai 3 classes :  
-> ChapitreJava qui contient 3 méthodes :
     - List<String> listeDesMots() qui va me retourner une liste de mots à partir d'une constante
     - Map<String, Integer> occurrencesDesMots(List<String> liste) qui retourne une liste de couples <String,Integer>, à chaque mot de la liste est associé son nombre d'occurrences
     - final String CHAPITRE2 =(....) : mon texte à analyser
 
-> AppletListe : mon applet
 
C'est surtout sur la 3e classe (IHMListe) que je bloque. Le but est de construire une IHM où je peux manipuler le texte : taper un mot dans un champ de saisie et regarder si ce mot est présent, compter le nombre d'occurrences de ce mot, voire le retirer du texte. De même, je peux classer par ordre croissant suivant les occurrences les mots du texte (et ordre décroissant). Jusque là, ça fonctionne bien. Là où je bloque, c'est dans l'utilisation d'un bouton annuler me permettant de faire un rollback sur le tri, ou le retrait du mot. Visiblement, le pattern Memento pourrait y répondre mais je ne vois pas comment faire.  
 
voici le code source de cette classe IHMListe :  
 

Code :
  1. //les imports
  2. public class IHMListe extends JPanel implements ActionListener, ItemListener {
  3.     private JPanel cmd = new JPanel();
  4.     private JLabel afficheur = new JLabel();
  5.     private JTextField saisie = new JTextField();
  6.     private JPanel panelBoutons = new JPanel();
  7.     private JButton boutonRechercher = new JButton("rechercher" );
  8.     private JButton boutonRetirer = new JButton("retirer" );
  9.     private CheckboxGroup mode = new CheckboxGroup();
  10.     private Checkbox ordreCroissant = new Checkbox("croissant", mode, false);
  11.     private Checkbox ordreDecroissant = new Checkbox("décroissant", mode, false);
  12.     private JButton boutonOccurrences = new JButton("occurrence" );
  13.     private JButton boutonAnnuler = new JButton("annuler" );
  14.     private TextArea texte = new TextArea();
  15.     private List<String> liste;
  16.     private Map<String, Integer> occurrences;
  17.     public IHMListe(List<String> liste, Map<String, Integer> occurrences) {
  18.         this.liste = liste;
  19.         this.occurrences = occurrences;
  20.         cmd.setLayout(new GridLayout(3, 1));
  21.         cmd.add(afficheur);
  22.         cmd.add(saisie);
  23.         panelBoutons.setLayout(new FlowLayout(FlowLayout.LEFT));
  24.         panelBoutons.add(boutonRechercher);
  25.         panelBoutons.add(boutonRetirer);
  26.         panelBoutons.add(new JLabel("tri du texte :" ));
  27.         panelBoutons.add(ordreCroissant);
  28.         panelBoutons.add(ordreDecroissant);
  29.         panelBoutons.add(boutonOccurrences);
  30.         panelBoutons.add(boutonAnnuler);
  31.         cmd.add(panelBoutons);
  32.         afficheur.setText(liste.getClass().getName() + " et "
  33.             + occurrences.getClass().getName());
  34.         texte.setText(liste.toString());
  35.         setLayout(new BorderLayout());
  36.         add(cmd, "North" );
  37.         add(texte, "Center" );
  38.         boutonRechercher.addActionListener(this);
  39.         boutonRetirer.addActionListener(this);
  40.         boutonOccurrences.addActionListener(this);
  41.         boutonAnnuler.addActionListener(this);
  42.        
  43.         ordreCroissant.addItemListener(this);
  44.         ordreDecroissant.addItemListener(this);
  45.     }
  46.     public void actionPerformed(ActionEvent ae) {
  47.         try {
  48.             boolean res = false;
  49.             if (ae.getSource() == boutonRechercher || ae.getSource() == saisie) {
  50.                 res = liste.contains(saisie.getText());
  51.                 Integer occur = occurrences.get(saisie.getText());
  52.                 afficheur.setText("résultat de la recherche de : "
  53.                     + saisie.getText() + " -->  " + res);
  54.             } else if (ae.getSource() == boutonRetirer) {
  55.                 res = retirerDeLaListeTousLesElementsCommencantPar(saisie
  56.                     .getText());
  57.                 afficheur
  58.                 .setText("résultat du retrait de tous les éléments commençant par -->  "
  59.                     + saisie.getText() + " : " + res);
  60.             } else if (ae.getSource() == boutonOccurrences) {
  61.                 Integer occur = occurrences.get(saisie.getText());
  62.                 if (occur != null)
  63.                     afficheur.setText(" -->  " + occur + " occurrence(s)" );
  64.                 else
  65.                     afficheur.setText(" -->  ??? " );
  66.             }
  67.             texte.setText(liste.toString());
  68.         } catch (Exception e) {
  69.             afficheur.setText(e.toString());
  70.         }
  71.     }
  72.     public void itemStateChanged(ItemEvent ie) {
  73.         if (ie.getSource() == ordreCroissant)
  74.           Collections.sort(liste);
  75.         else if (ie.getSource() == ordreDecroissant) {
  76.            Stack<String> stack = new Stack<String>();
  77.            Collections.sort(liste);
  78.            for (Iterator<String> it = liste.iterator() ;  it.hasNext();) {
  79.              stack.push(it.next()) ;
  80.             }
  81.             liste.clear(); //vider liste
  82.             while (!stack.isEmpty()) {
  83.               liste.add(stack.pop());
  84.             }
  85.         }
  86.         texte.setText(liste.toString());
  87.     }
  88.     private boolean retirerDeLaListeTousLesElementsCommencantPar(String prefixe) {
  89.         boolean resultat = false;
  90.         for (Iterator <String> it = liste.iterator() ; it.hasNext();) {
  91.          String s = it.next();
  92.          if (s.startsWith(prefixe)) {
  93.            it.remove();
  94.            occurrences.put(prefixe, 0);
  95.            resultat = true;
  96.           }
  97.         }
  98.         return resultat;
  99.     }
  100. }


Message édité par roswellentongues le 25-11-2013 à 15:37:30
Reply

Marsh Posté le 25-11-2013 à 15:34:55   

Reply

Marsh Posté le 25-11-2013 à 19:58:05    

Sur chaque action, avant d'opérer la modification, tu stockes :
- la liste List<String>
- un memo String, par exemple "retirer mot mmm' ou "tri croissant"  
 
Donc tu crées un objet Etape avec ces deux attributs.
Et tu enrichis une ArrayList de Etape au fur et à mesure des actions.
 
Ensuite, en présentant les Etape.memo des étapes dans un ComboBox, le bouton annuler permet de recharger la Etape.list


Message édité par willy le kid le 25-11-2013 à 19:58:36
Reply

Marsh Posté le 26-11-2013 à 14:40:16    

Je pense être sur la bonne piste. Néanmoins, je suis confronté à un bug sur le nombre d'occurrences :
en gras les modif

Code :
  1. public class IHMListe2 extends JPanel implements ActionListener, ItemListener {
  2.    //blablabla
  3.     private List<String> liste;
  4.     private Map<String, Integer> occurrences;
  5.     private Stack<List<String>> pileSave ;
  6.    
  7.     public IHMListe2(List<String> liste, Map<String, Integer> occurrences) {
  8.         this.liste = liste;
  9.         this.occurrences = occurrences;
  10.         pileSave = new Stack();
  11.         //blablabla
  12.         panelBoutons.add(boutonAnnuler);
  13.         cmd.add(panelBoutons);
  14.         //blabla
  15.         boutonOccurrences.addActionListener(this);
  16.         boutonAnnuler.addActionListener(this);
  17.      
  18.         ordreCroissant.addItemListener(this);
  19.         ordreDecroissant.addItemListener(this);
  20.     }
  21.     public void actionPerformed(ActionEvent ae) {
  22.         try {
  23.             boolean res = false;
  24.             if (ae.getSource() == boutonRechercher || ae.getSource() == saisie) {
  25.                 res = liste.contains(saisie.getText());
  26.                 Integer occur = occurrences.get(saisie.getText());
  27.                 afficheur.setText("résultat de la recherche de : "
  28.                     + saisie.getText() + " -->  " + res);
  29.             } else if (ae.getSource() == boutonRetirer) {
  30.                 this.sauvegarder();
  31.                 res = retirerDeLaListeTousLesElementsCommencantPar(saisie
  32.                     .getText());
  33.                 afficheur
  34.                 .setText("résultat du retrait de tous les éléments commençant par -->  "
  35.                     + saisie.getText() + " : " + res);
  36.             } else if (ae.getSource() == boutonOccurrences) {
  37.                 //this.sauvegarder();
  38.                 Integer occur = occurrences.get(saisie.getText());
  39.                 if (occur != null)
  40.                     afficheur.setText(" -->  " + occur + " occurrence(s)" );
  41.                 else
  42.                     afficheur.setText(" -->  ??? " );
  43.             }
  44.             else if (ae.getSource() == boutonAnnuler) {
  45.               if (!pileSave.isEmpty()) {
  46.                 liste = (LinkedList) pileSave.pop() ;
  47.                 afficheur.setText("Modif annulee" );
  48.                 texte.setText(liste.toString());
  49.                  } else {
  50.                     afficheur.setText("Pas de modif" );
  51.                     }
  52.             }
  53.             texte.setText(liste.toString());
  54.         } catch (Exception e) {
  55.             afficheur.setText(e.toString());
  56.         }
  57.     }
  58.     public void itemStateChanged(ItemEvent ie) {
  59.         if (ie.getSource() == ordreCroissant){
  60.           this.sauvegarder();
  61.           Collections.sort(liste);
  62.         }
  63.         else if (ie.getSource() == ordreDecroissant) {
  64.           this.sauvegarder();
  65.            Stack<String> stack = new Stack<String>();
  66.            Collections.sort(liste);
  67.            for (Iterator<String> it = liste.iterator() ;  it.hasNext();) {
  68.              stack.push(it.next()) ;
  69.             }
  70.             liste.clear(); //vider liste
  71.             while (!stack.isEmpty()) {
  72.               liste.add(stack.pop());
  73.             }
  74.         }
  75.         texte.setText(liste.toString());
  76.     }
  77.    //blabla
  78.     private void sauvegarder() {
  79.       pileSave.push(new LinkedList (liste));
  80.     }
  81. }


 
Quand je fais une recherche dans ma liste de mot d'un terme, il me sort bien "true" en retour (signe qu'il l'a trouvé) et si je demande son nombre d'occurrences, c'est bien le bon nombre.
Si je retire ce terme, en faisant une recherche, j'obtiens un "false" en retour, signe qu'il a bien été retiré et 0 en occurrence.
Quand j'annule, il réapparaît bien dans ma liste, je le vois, si je fais une nouvelle recherche, j'ai un "true", mais toujours 0 en occurrence.  
Où est l'erreur ?
 
Merci d'avance


Message édité par roswellentongues le 26-11-2013 à 14:43:22
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed