2016-09-21 4 views
0

私はこれとあまりにも長い間戦ってきたので誰かが助けてくれることを願っています。(元に戻す/やり直し|| KeyStrokes)がJEditorPaneで機能しない

私がJEditorPaneの拡張クラスで(私はhttp://alvinalexander.com/java/java-undo-redoで発見)元に戻す/やり直しを実装しようとしています:私のキーストロークが解雇されていない何らかの理由または元に戻すため

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働いている。

私はそれを動作させることができません。誰かが私に何かを指してくれますか?

答えて

1

あなたのコードは、私はあなたのコードから

this.setEditorKit(new ShowSpecCharsEditorKit());をコメントしたときに、これはエディタキットに問題がある可能性があり、キーストロークのカスタムたEditorKit(ShowSpecCharsEditorKit)の実装のコードを確認してください正常に動作しているようですとアクション。

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 .. JTabbedPane内のJScrollPaneでTextEditorを使用しています。 KeyStrokesが他の場所に登録している可能性はありますか?つまり、他のコンポーネントがリッスンしている可能性があり、これらのイベントがコンポーネントに含まれていない可能性がありますか? – amateurjustin

+1

フォーカスが合ったコンポーネントにキーストロークが登録されます。フォーカスされたコンポーネントにリスナーがない場合は、親に移動します。あなたのケースでは、テキスト作成者はリスナーを持っているので、私はそれが他のものに登録されているとは思わない。 –

+0

あなたはエディタキットにコメントしてみましたか?あなたがカスタムエディタキットとこのテキストエディタの親に私にコードを渡した場合、私は実際の原因を見つけることができます –

関連する問題