Я надеюсь, что кто-то может помочь, потому что я слишком долго сражаюсь с этим и не могу опустить его в голову.(Undo/Redo || KeyStrokes) не работает в JEditorPane
Я пытаюсь реализовать Undo/Redo (который я нашел в http://alvinalexander.com/java/java-undo-redo) в 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);
}
}
По какой-то причине мои нажатия клавиш не обожженного или отмены/повтора просто ISN» т работы.
Я не могу заставить его работать. Может, кто-нибудь может что-то сказать мне, пожалуйста?
Хм .. Я использую свой TextEditor в JScrollPane внутри JTabbedPane. Возможно ли, что мои KeyStrokes регистрируются где-то в другом месте? Возможно ли, что некоторые другие компоненты прослушиваются и что эти события не попадают в мой компонент? – amateurjustin
нажатия клавиш будут записаны на сфокусированный компонент, если у сфокусированного компонента нет слушателя, тогда он перейдет к его родительскому элементу. в вашем случае, так как у текстостроителя есть слушатель, я не думаю, что он регистрируется на что-то еще. –
Вы пробовали комментировать редакторский комплект? также попробуйте прокомментировать caretUpdate (я не думаю, что это несет ответственность, хотя), я могу найти фактическую причину, если вы дали мне код для вашего настраиваемого набора редакторов и родителя этого текстового редактора –