Sommaire: Cours Java Undo Redo
Généralités
Transactions annulables
Séquences de transactions
Evénements d’édition
Textes
Etats
Extrait du cours Java Undo Redo
Généralités
« Le “undo” (annuler) et “redo” (refaire) sont parmis les opérations les plus appréciées dans les interfaces ergonomiques.
« Ce sont des opérations difficiles à implémenter.
« Questions:
#quelles sont les transactions annulables ?
#quelle partie de l’environnement doit être sauvegardée pour pouvoir le reconstituer ?
#vaut-il mieux conserver l’opération, ou son inverse ?
« Java fournit un cadre surtout adapté aux opérations sur les textes.
« Plusieurs variantes existent, mais il reste du travail au programmeur.
UndoableEdit
« L’interface de base est UndoableEdit. Une implémentation par défaut est AbstractUndoableEdit
« “Edit” est synonyme de transaction ou opération, terme emprunté aux éditeurs de textes.
« Les méthodes sont
booleancanUndo() indique que la transaction peut être annulée
booleancanRedo() indique que la transaction peut être refaite
voiddie() la transaction ne peut plus être annulée ni répétée
voidredo() throws CannotRedoException refait la transaction
voidundo() throws CannotUndoException annule la transaction
Abstract Undoable Edit
« C’est l’implémentation par défaut de UndoableEdit
« Elle maintient deux booléens internes aliveet donequi gèrent correctement le canUndo()et canRedo().
« On sous-classe cette classe en redéfinissant undo()et redo()
« On utilise la sur-classe en applant super.undo(), super.redo().
Exemple des boutons à cocher
« L’opération de coche ou décoche peut être annulée ou refaite, à partir d’un autre composant (paire de boutons, plus souvent entrée de menu ou boutons d’une barre d’outils)
Démarche:
« Chaque action sur le bouton génère un objet d’une classe ToggleEdit dérivant deAbstractUndoableEdit. L’objet contient
#le bouton concerné
#l’état du bouton
« La classe ToggleEditredéfinit les méthodes undo()et redo().
« L’opération d’annulation ou répétition est lancée en appelant la méthode undo()ouredo()sur l’objet créé.
ToggleEdit
import javax.swing.undo.*;
public class ToggleEdit extends AbstractUndoableEdit {
private final JToggleButton bouton;
private final boolean selectionne;
public ToggleEdit(JToggleButton bouton) {
this.bouton = bouton;
selectionne = bouton.isSelected();
}
public void redo() throws CannotRedoException {
super.redo();
bouton.setSelected(selectionne);
}
public void undo() throws CannotUndoException {
super.undo();
bouton.setSelected(!selectionne);
}
}
Le panneau
« Le panneau est composé de trois boutons à cocher
« et de deux boutons d’annulation et répétition:
« chaque bouton à cocher (JCheckBox) a un écouteur dont la méthode actionPerformedest :
JCheckBox gras = new JCheckBox(« gras »);
JCheckBox ital = new JCheckBox(« italique »);
JCheckBox soul = new JCheckBox(« souligné »);
JButton undoButton = new JButton(« Undo »);
JButton redoButton = new JButton(« Redo »);
undoButton.addActionListener(newUndoIt());
redoButton.addActionListener(newRedoIt());
public void actionPerformed(ActionEvent ev) {
JToggleButton b = (JToggleButton) ev.getSource();
edit= new ToggleEdit(b);
updateButtons(); // voir page suivante
}
Les écouteurs
class UndoIt implements ActionListener {
public void actionPerformed(ActionEvent ev) {
try {
edit.undo();
} catch (CannotUndoException ex) {}
finally {
updateButtons();
}
}
}
class RedoIt implements ActionListener {
public void actionPerformed(ActionEvent ev) {
try {
edit.redo();
} catch (CannotRedoException ex) {}
finally {
updateButtons();
}
}
}
private void updateButtons() {
undoButton.setText(edit.getUndoPresentationName());
redoButton.setText(edit.getRedoPresentationName());
undoButton.setEnabled(edit.canUndo());
redoButton.setEnabled(edit.canRedo());
}
Complément
« L’interface UndoableEdita une méthode getPresentationNamequi retourne une chaîne de caractère façonnable en fonction de la transaction
« Les méthodes get Un do Presentation Name et getRedoPresentationName concatènent le préfix Un do et Redo avec la chaîne fournie par getPresentationName
class ToggleEdit{
private final JToggleButton bouton;
private final boolean selectionne;
…
public String getPresentation Name() {
return « \ » » + bouton.getText()
+(selectionne ? » on » : » off ») + « \ » »;
}
…
}
Séquences de transactions
« Pour se “souvenir” d’une séquence de transactions, et pouvoir revenir en arrière arbitrairement loin, on utilise un gestionnaire de transactions (Undo Manager).
« Un Undo Managergère les transactions (Edit). Il permet de reculer (undo) et d’avancer (redo) tant que possible.
« Une transaction à inscrire dans un gestionnaire doit lui être notifiée,
#soit directement, par add Edit(Un doable Edit edit)
#soit en utilisant le fait qu’un Undo Manager implémente un
Un doable Edit Listener. On enregistre le gestionnaire dans la liste des auditeurs.
………
Cours Java Undo Redo séquences de transactions ( 160 KO) (Cours PDF)