2010-11-18 36 views
2

J'ai une application avec un JPanel et des boutons sur lesquels les utilisateurs cliquent pour dessiner des formes sur le panneau. Vous pouvez colorier et redimensionner les formes ainsi que les déplacer dans le panneau. Comment ferais-je pour implémenter l'annulation et la reprise pour une telle application? J'ai une classe Actions où toutes les actions sont réellement implémentées. Dans cette classe, chaque action est sa propre classe qui étend AbstractAction. Ma classe Actions est essentiellement une classe imbriquée.Annulation et rétablissement des événements Action en Java

par exemple, c'est l'une des classes dans mes actions classe:

private class RandomAction extends AbstractAction { 
    private static final long serialVersionUID = 1L; 
    public NewAction(String text, ImageIcon icon, String desc){ 
      super(text, icon); 
      putValue(SHORT_DESCRIPTION, desc); 
     } 
     public void actionPerformed(ActionEvent e) { 

     } 
    } 

Lorsque je crée alors un bouton tout ce que je fais est:

randButton = new JButton(Actions.RandomAction); 

Répondre

4

undo Habituellement/fonctionnalité redo se fait par la mise en œuvre une pile. Vous pouvez implémenter votre propre pile d'actions qui garde la trace des actions X précédentes, que vous pouvez ensuite désactiver à chaque fois que l'utilisateur annule une action. Vous devrez probablement également conserver un type de structure similaire pour la fonctionnalité de rétablissement. Ainsi, lorsqu'une action est retirée de la pile d'annulation, elle doit d'abord aller à la pile de rétablissement.

Si vous utilisez Java et NetBeans (bien que vous n'ayez pas besoin d'utiliser l'EDI NetBeans à proprement parler), vous pouvez consulter la plate-forme NetBeans (peut être téléchargée séparément). Je n'ai pas travaillé avec l'annulation/refaite beaucoup, mais il fournit la fonctionnalité.

Personnellement, je voudrais juste écrire une classe qui enveloppe toute «action» que l'utilisateur peut faire, que je vois que vous avez déjà fait. Maintenant, il s'agit simplement d'implémenter une pile pour garder une trace de ces actions, et quand on est sorti de la pile d'annulation, vous devez faire le "contraire" de l'action. Placez l'objet sur une pile de rétablissement, ainsi quand l'utilisateur clique sur refaire, vous pouvez simplement enlever l'action de la pile de rétablissement et laisser votre application la manipuler normalement.

+0

Merci, je pensais vraiment à l'implémenter de cette façon. – sigfreik

0

Je suis d'accord avec le post de Nico et j'ajouterai qu'il est possible d'utiliser une pile pour annuler/refaire. Il y a deux ans, à l'université, j'écrivais un éditeur de diagramme de flux de données qui nécessitait une fonctionnalité complète d'annulation/rétablissement. J'ai créé une classe Action abstraite représentant n'importe quelle action utilisateur possible (avec les méthodes Undo et Do), et une ActionStack qui encapsule une liste de toutes les actions effectuées et maintient un pointeur vers la dernière action effectuée. Annuler des actions déplace le pointeur vers le bas de la pile, et les refaire le déplace vers le haut. Donc, si l'utilisateur effectue 10 actions, la pile contiendra les actions 1-10 et le pointeur pointe vers l'action # 10. Si l'utilisateur exécute ensuite 5 annulations, il y aura toujours 10 actions sur la pile, mais le pointeur reviendra à l'action 5. Si l'utilisateur effectue alors une nouvelle action, toutes les actions au-dessus du pointeur (actions 6-10) seront supprimées, la nouvelle action sera ajoutée en haut de la pile et le pointeur sera ajusté en conséquence. Les actions utilisateur que vous décrivez ne vous paraissent pas trop compliquées, mais pour des actions plus complexes, vous pouvez les autoriser à être composées d'actions enfants.

+0

Je fais exactement la même chose pour la fonctionnalité annuler/rétablir de mon projet actuel. – almathie

+0

Je pourrais essayer car cela rendra mon application plus efficace en raison de ne pas avoir deux piles. – sigfreik