Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1767 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Bouton annuler : pattern memento

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Bouton annuler : pattern memento

n°2211581
roswellent​ongues
Posté le 25-11-2013 à 15:34:55  profilanswer
 

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

---------------
ID Steam/PSN : Roswellenshort - ID Origin : KptainBigleux
mood
Publicité
Posté le 25-11-2013 à 15:34:55  profilanswer
 

n°2211622
willy le k​id
Posté le 25-11-2013 à 19:58:05  profilanswer
 

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
n°2211695
roswellent​ongues
Posté le 26-11-2013 à 14:40:16  profilanswer
 

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

---------------
ID Steam/PSN : Roswellenshort - ID Origin : KptainBigleux

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Bouton annuler : pattern memento

 

Sujets relatifs
activer un bouton radio à partir d'un autre bouton radio en javaBouton + progressbar circulaire
[Qt Débutant] Insérer une icone dans un boutonGénérer un bouton personnalisé avec javascript (construction d’aventur
Bouton a cassé méthode autofillAnnuler effet clic gauche sur un événement mousedown
Ctrl+ affecté à un bouton sur page HTMLcustom bouton radio
[Résolu] Bouton Facebook et affichage de la mention chez les votantsAu secours, Commande / Bouton Recherche en HTML
Plus de sujets relatifs à : Bouton annuler : pattern memento



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR