Java: méthodes Undo et Redo pour une classe Rectangle [duplicate]

Oct 16 2020

J'ai une classe Rectangle personnalisée:

public class Rectangle () {
      private int height, width, x, y;
      private Color color;
      
      public Rectangle () {
           this.height = null;
           this.width = null;
           this.x = null;
           this.y = null;
           this.color = null;
      }
      
      public void setHeight(int h) { this.height = h; }

      public void setWidth(int w) { this.width = w; }
      
      public void setX(int x) { this.x = x; }
      
      public void setY(int y) { this.y = y; }
       
      public void setColor(Color c) { this.color = c; }

      public int getWidth() { return this.width; }
      
      public int getHeight() { return this.height; }

      public int getX() { return this.x; }
      
      public int getY() { return this.y; }
      
      public Color getColor() { return this.color; }
      
      public void undo() {   }

      public void redo() {   }

}

Comment pourrais-je procéder pour implémenter les fonctions d'annulation et de rétablissement pour cette classe de manière à ce qu'elle puisse rétablir le rectangle à son état précédent sans que l'utilisateur mentionne la dernière méthode utilisée. J'ai une vague idée qui implique l'utilisation d'une pile, mais je ne sais pas comment la coder. Ma deuxième question est que je ne suis pas sûr que mon constructeur soit correct, je initialise tout à null sans donner de paramètres car je veux que les gens utilisent les getters / setters à la place. Veuillez aider.

Réponses

1 Harkal Oct 16 2020 at 12:37

vous pouvez enregistrer l'état dans un tableau et restaurer le rectangle à partir de celui-ci

public class Rectangle () {
    
    private states: List<Rectangle> = new ArrayList(); // we save the state of rectangle on every update to any property
    private int stateIndex = 0; // this is the index of the state which is active on this rectangle
    
    private int height, width, x, y;
    private Color color;
    
    public Rectangle () {
       this.height = null;
       this.width = null;
       this.x = null;
       this.y = null;
       this.color = null;
    }
    
    public void setHeight(int h) { 
        this.stateIndex = states.size() + 1; // we ll increase one in state index as new state is added to the states
        this.height = h; 
        this.states.add(this); // add the state after you set the value of any property
    }
    
    public void undo() { 
        if(this.stateIndex > 0){ // only undo when there is state available before the current state
            this.stateIndex--; // reduce the current index by one
            this.height = this.states.get(stateIndex).height; // set the properties from state
            ...
        }
    }
    
    public void redo() {    
        if(this.stateIndex < states.size()){ // can go more the available states in cache
            this.stateIndex++; // increase the current state index
            this.height = this.states.get(stateIndex).height; // update the values of the properties
            ...
        }
    }

}