Bonjours j'aimerais que vous m'aidez a lier
la commande CTRL+Z a mon JTEXTAREA.
Merci d'avance.
Version imprimable
Bonjours j'aimerais que vous m'aidez a lier
la commande CTRL+Z a mon JTEXTAREA.
Merci d'avance.
Tu veux pouvoir annuler la dernière modification dans un JTextArea ?
Oui.
Ben là, ça va te faire un choc !!! :aie:
Il faut utiliser une méthode de programmation basée sur un design pattern :
http://rpouiller.developpez.com/tuto...r/?page=page_4
En gros, il faut enregistrer les modifications au fur et à mesure de la frappe au clavier dans un tableau
et quand il y a un Ctrl Z alors on remonte dans le tableau pour rétablir les données telles qu'elles étaient à l'étape précédente.
C'est très pédagogique pour le développement java (notion d'interface, de tableaux d'objets, d'exécution de commande, etc.)
Merci, je vais m'y mettre. Je vous recontacte.
Salut,
Le support de Undo/Redo de Swing ne suffit-il pas, sans nier l'aspect pédagogique du tutoriel cité par ailleurs ? Où il y aurait une subtilité que je n'aurais pas saisie ?
Code:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182 import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.UndoableEditEvent; import javax.swing.text.JTextComponent; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; public class UndoRedo { public static final String REDO_ACTION_KEY = "UndoRedo.REDO"; public static final String UNDO_ACTION_KEY = "UndoRedo.UNDO"; private final UndoManager undoManager; private final UndoAction undoAction; private final RedoAction redoAction; public UndoRedo(JTextComponent component) { undoManager = new UndoManager(); undoAction = new UndoAction(); redoAction = new RedoAction(); component.getDocument().addUndoableEditListener((e)-> happen(e)); instalKeys(component); } private void happen(UndoableEditEvent e) { undoManager.addEdit(e.getEdit()); undoAction.updateUndoState(); redoAction.updateRedoState(); } private void instalKeys(JTextComponent component) { InputMap inputMap = component.getInputMap(); ActionMap actionMap = component.getActionMap(); installKey( inputMap, actionMap, getUndoKey(), UNDO_ACTION_KEY, undoAction); installKey( inputMap, actionMap, getRedoKey(), REDO_ACTION_KEY, redoAction); } private void installKey(InputMap inputMap, ActionMap actionMap, KeyStroke key, String actionKey, Action action) { if ( key!=null ) { inputMap.put(key, actionKey); actionMap.put(actionKey, action); } } protected KeyStroke getUndoKey() { return KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK); } protected KeyStroke getRedoKey() { return KeyStroke.getKeyStroke(KeyEvent.VK_R, Event.CTRL_MASK); } public UndoAction getUndoAction() { return undoAction; } public RedoAction getRedoAction() { return redoAction; } public UndoManager getUndoManager() { return undoManager; } public String getUndoActionName() { return UIManager.getString("AbstractUndoableEdit.undoText"); } public String getRedoActionName() { return UIManager.getString("AbstractUndoableEdit.redoText"); } private class UndoAction extends AbstractAction { public UndoAction() { super(getUndoActionName()); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undoManager.undo(); } catch (CannotUndoException ex) { System.out.println("Unable to undo: " + ex); ex.printStackTrace(); } updateUndoState(); redoAction.updateRedoState(); } protected void updateUndoState() { if (undoManager.canUndo()) { setEnabled(true); putValue(Action.NAME, undoManager.getUndoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, getUndoActionName()); } } } private class RedoAction extends AbstractAction { public RedoAction() { super(getRedoActionName()); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undoManager.redo(); } catch (CannotRedoException ex) { System.out.println("Unable to redo: " + ex); ex.printStackTrace(); } updateRedoState(); undoAction.updateUndoState(); } protected void updateRedoState() { if (undoManager.canRedo()) { setEnabled(true); putValue(Action.NAME, undoManager.getRedoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, getRedoActionName()); } } } public static void main(String[] args) { SwingUtilities.invokeLater(()->demo()); } private static void demo() { JFrame frame = new JFrame("Démo undo/redo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextArea textArea = new JTextArea(); UndoRedo undoRedo = new UndoRedo(textArea); frame.setJMenuBar(createMenuBar(undoRedo)); frame.getContentPane().add(new JScrollPane(textArea)); frame.setSize(300, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); } private static JMenuBar createMenuBar(UndoRedo undoRedo) { JMenu menu = new JMenu("Edition"); menu.add(new JMenuItem(undoRedo.getUndoAction())); menu.add(new JMenuItem(undoRedo.getRedoAction())); JMenuBar menuBar = new JMenuBar(); menuBar.add(menu); return menuBar; } }