IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[débutant][Stratégie]Gestion undo et redo


Sujet :

Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 28
    Points : 17
    Points
    17
    Par défaut [débutant][Stratégie]Gestion undo et redo
    Bonjour,

    J'aimerais implémenter dans mon programme une commande undo et pourquoi pas après, une commande re-do.

    Le seul moyen pour moi est de créer une pile ou je stocke les commandes les unes après les autres et lorsque l'utilisateur choisi de "défaire", je dépile. Or dans cette pile, je dois stocker pour chaque commandes des variables différentes (ex: pour un zoom, je dois sauver dans la pile l'ancienne zone et la nouvelle, pour un changement de couleur, c'est l'ancienne et la nouvelle....les éléments peuvent être très différents )

    Connaissez-vous un objet servant de pile qui pourrait m'être utile ou dois-je en créer un ? :

    merci de votre aide.

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Pour moi une ArrayList te suffirait.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    hello,
    Personnellement j'utiliserais un objet de type Vector , je pense que c 'est le plus adequat.

    Cordialement
    ShiShiWa

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Merci...mais que pourrait m'apporter la synchronisation d'un vector ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Hello,
    Comment ça synchroniser un vector ?? (pas trop bien compris la question)
    Un vector est une sorte de tableau.

    Cordialement
    ShiShiWa

  6. #6
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Citation Envoyé par pacha1
    Merci...mais que pourrait m'apporter la synchronisation d'un vector ?
    Ca peux être utile en cas d'accès concurrent aux données que contient ta pile. A toi de voir si c'est nécessaire ou pas.
    Si tu choisis la solution de la synchronisation, il est peut-être plus conseillé de passer par la méthode statique synchronizedList(taListe) de la classe Collections. Pour plus d'infos : The Collections Framework
    J'espère que j'ai pu t'aider.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Merci Vedaer pour le lien,je n'avais jamais aborde cette aspect des Vector.
    ShiShiWa

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    merci Vedaer pour tes conseils,
    mais ce n'est peut-être pas utile vu que je vais dépiler à chaque fois le dernier élément, il ne devrait pas y avoir de concurence entre les données.
    Dans ce cas, une ArrayList me parait suffisant, non ?
    :

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Dans un code j'ai trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AttributeChangeEvent ace = new AttributeChangeEvent(this, name,
                                                            oldValue, newValue,
                                                            local_);
    change_.firePropertyChange(ace);
    ou change_ est un java.beans.PropertyChangeSupport.
    et apparemment, chaque modification entraine une sorte d'empilement dans cet objet change_...

    Connaissez-vous ces objets ? Peuvent-ils me servir ?

  10. #10
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Salut,
    mais ce n'est peut-être pas utile vu que je vais dépiler à chaque fois le dernier élément, il ne devrait pas y avoir de concurence entre les données.
    Biensur. Tout dépend de ton implémentation. Vérifie juste qu'il n'y ai pas plusieurs Threads capables d'acceder à ta pile pour le modifier.
    Connaissez-vous ces objets ? Peuvent-ils me servir ?
    AttributeChangeEvent ne fais pas partie de l'API standard à ma connaissance.
    Pour PropertyChangeSupport elle est utile si tu travaille avec des beans. Elle facilite juste le travail avec les listeners associés à un bean donné. A priori, je ne vois pas en quoi elle pourrais te servir.
    chaque modification entraine une sorte d'empilement dans cet objet change_...
    Il n'y a pas d'empilement, juste la transmission (aux listeners associés) qu'il y a eu modification d'une des propriétés du bean.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  11. #11
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Je sais pas ce que tu veux exactement mais les commandes Undo Redo sont deja implementé en swing (pile de sauvegarde...) alors va voir ici :
    http://www-igm.univ-mlv.fr/%7Eberstel/Cours/CoursJava/7-UndoRedo.pdf
    C'est quasiment deja tout implementé en swing. T'as quasiment rien a faire
    T'as juste a faire des classes qui etendent AbstractUndoableEdit pour chaque action de ton prog pour laquelle tu decide qu'elle est annulable.

    Un exemple de mon code lorsque je supprime un noeud de mon arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package projet.controleur;
     
    import hypertree.*;
    import projet.*;
     
    import javax.swing.undo.*;
     
     
    public class UndoRedoForDeleteSignet extends AbstractUndoableEdit{
     
        private Contenu contenu;
        private MyNode node;
        private MyNode pere;
        private MyNode root;
     
        public UndoRedoForDeleteSignet(MyNode node,Contenu contenu){
            this.node = node;
            this.contenu = contenu;
            this.pere = (MyNode)node.getParent();
            this.root = (MyNode)node.getRoot();
        }
     
        public void undo() throws CannotUndoException {
            super.undo();
            node.restoreColor();
            pere.addChild(node);
            HyperTree hyperTree=contenu.getHyperTree();
            hyperTree.setModel(new HTModel(root));
            contenu.maj(hyperTree);
        }
     
        public void redo() throws CannotRedoException {
            super.redo();
            node.removeFromParent();
            HyperTree hyperTree=contenu.getHyperTree();
            hyperTree.setModel(new HTModel(root));
            contenu.maj(hyperTree);
        }
     
     
        public boolean canUndo(){
            return true;
        }
     
        public boolean canRedo(){
            return true;
        }
     
     
    }
    Et dans ton listener tu met un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    protected UndoManager manager;
     
    manager = new UndoManager();//dans ton constructeurs
     
    private void actionAnnuler(){
            //System.out.println("Pression sur Annuler");
            try {
                manager().undo();
            }
            catch (CannotUndoException ex) {
                System.out.println("Erreur Undo: "+ex.toString());
            }
            contenuMenu.majUndoRedo();
        }
     
        private void actionRetablir(){
            //System.out.println("Pression sur Retablir");
            try {
                manager().redo();
            }
            catch (CannotUndoException ex) {
                System.out.println("Erreur Undo: "+ex.toString());
            }
            contenuMenu.majUndoRedo();
        }
     
    private void actionSupprimer(){
            //System.out.println("Pression sur Supprimer");
            ...
            //on sauve l'etat
                    UndoableEdit edit = new UndoRedoForDeleteSignet(myNode,this);
                    UndoableEditEvent ue = new UndoableEditEvent(this,edit);
                    manager().undoableEditHappened(ue);
     
            //on supprime
                    myNode.remove();
                 ...
        }
    Je te donne le code en vrac mais avec le pdf et ca tu devrais t'en sortir (si c'est bien ce que tu veux faire )
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Je reviens au tout début de la discussion mais pour la modélisation (sans choix d'implémentation) des commandes undo et re-do, tu peux jeter un oeil sur le design pattern "Command"...

    Julien

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    merci de vos conseils. Je crois que je devrais m'en sortir...
    merci pour les liens..."command" a pas l'air mal du tout...

    bonne journée à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter les fonctions undo et redo
    Par lass7 dans le forum Android
    Réponses: 37
    Dernier message: 21/01/2015, 11h54
  2. Actions undo et redo qui ne se dégrisent pas
    Par MystEre dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 11/03/2013, 12h20
  3. Undo et redo déjà implementé ?
    Par keul85 dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 29/03/2010, 13h36
  4. Gestion Undo
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 18/08/2005, 13h10
  5. Réponses: 2
    Dernier message: 05/10/2004, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo