J'espère que quelqu'un peut vous aider parce que je me bats depuis trop longtemps avec ceci et que je ne peux pas comprendre.(Annuler/Rétablir || KeyStrokes) ne fonctionne pas dans JEditorPane
Je suis en train de mettre en œuvre Undo/Redo (que je trouvais à http://alvinalexander.com/java/java-undo-redo) dans une classe étendue JEditorPane:
public class TextEditor extends JEditorPane {
class UndoHandler implements UndoableEditListener {
@Override
public void undoableEditHappened(UndoableEditEvent e) {
undoManager.addEdit(e.getEdit());
undoAction.update();
redoAction.update();
}
}
class UndoAction extends AbstractAction {
public UndoAction() {
super("Undo");
setEnabled(false);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("UNDO!");
try {
undoManager.undo();
} catch (CannotUndoException ex) {
// TODO deal with this
ex.printStackTrace();
}
update();
redoAction.update();
}
protected void update() {
if (undoManager.canUndo()) {
setEnabled(true);
putValue(Action.NAME, undoManager.getUndoPresentationName());
} else {
setEnabled(false);
putValue(Action.NAME, "Undo");
}
}
}
class RedoAction extends AbstractAction {
public RedoAction() {
super("Redo");
setEnabled(false);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("REDO!");
try {
undoManager.redo();
} catch (CannotRedoException ex) {
ex.printStackTrace();
}
update();
undoAction.update();
}
protected void update() {
if (undoManager.canRedo()) {
setEnabled(true);
putValue(Action.NAME, undoManager.getRedoPresentationName());
} else {
setEnabled(false);
putValue(Action.NAME, "Redo");
}
}
}
private UndoHandler undoHandler = new UndoHandler();
private UndoManager undoManager = new UndoManager();
private UndoAction undoAction = new UndoAction();
private RedoAction redoAction = new RedoAction();
public TextEditor() {
super();
this.setEditorKit(new ShowSpecCharsEditorKit());
this.getDocument().addUndoableEditListener(undoHandler);
KeyStroke undoKeystroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK);
KeyStroke redoKeystroke = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK);
this.getInputMap().put(undoKeystroke, "undoKeystroke");
this.getActionMap().put("undoKeystroke", undoAction);
this.getInputMap().put(redoKeystroke, "redoKeystroke");
this.getActionMap().put("redoKeystroke", redoAction);
this.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
((EditorTab)getParent().getParent()).updateTabTitle(true);
}
});
}
@Override
public void read(Reader r, Object desc) throws IOException{
super.read(r, desc);
}
}
Pour une raison quelconque mes frappes ne sont pas tirées ou l'undo/redo juste isn » t travaillant.
Je ne peux pas le faire fonctionner. Quelqu'un pourrait-il me signaler quelque chose, s'il vous plaît?
Hmm .. J'utilise mon TextEditor dans un JScrollPane dans un JTabbedPane. Est-il possible que mes KeyStrokes s'inscrivent ailleurs? Est-il possible que d'autres composants écoutent et que ces événements ne tombent pas dans mon composant? – amateurjustin
les séquences de touches seront enregistrées dans le composant focalisé, si le composant focalisé n'a pas d'écouteur, il ira à son parent. Dans votre cas, puisque le texteditor a un auditeur, je ne pense pas qu'il soit enregistré pour autre chose. –
avez-vous essayé de commenter le kit de l'éditeur? aussi essayer de commenter le caretUpdate (je ne pense pas qu'il est responsable si) je peux trouver la cause réelle si vous me donniez le code à votre kit éditeur personnalisé et le parent de ce texteditor –