2016-09-21 1 views
0

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?

Répondre

1

Votre code semble fonctionner très bien quand je commentais

this.setEditorKit(new ShowSpecCharsEditorKit()); de votre code

cela pourrait être le problème avec le kit de l'éditeur, s'il vous plaît vérifier le code de votre EditorKit personnalisé (ShowSpecCharsEditorKit) mise en œuvre sur les frappes de touche et Actions.

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); 
    } 

    public static void main(String[] args) { 
     JFrame jframe = new JFrame(); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setSize(500, 500); 
     jframe.add(new TextEditor()); 
     jframe.setVisible(true); 
    } 
} 
+0

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

+1

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. –

+0

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 –