Code
public static JPopupMenu installTextComponentPopupMenu(final JTextComponent tc) {
final UndoManager manager = new UndoManager();
final Action undoAction = new UndoAction(manager);
final Action redoAction = new RedoAction(manager);
final Action cutAction = new DefaultEditorKit.CutAction();
final Action copyAction = new DefaultEditorKit.CopyAction();
final Action pasteAction = new DefaultEditorKit.PasteAction();
final Action deleteAction = new AbstractAction("delete") {
public void actionPerformed(ActionEvent e) {
JPopupMenu pop = (JPopupMenu)e.getSource();
((JTextComponent)pop.getInvoker()).replaceSelection(null);
}
};
tc.addAncestorListener(new AncestorListener() {
public void ancestorAdded(AncestorEvent e) {
manager.discardAllEdits();
tc.requestFocusInWindow();
}
public void ancestorMoved(AncestorEvent e) {}
public void ancestorRemoved(AncestorEvent e) {}
});
tc.getDocument().addUndoableEditListener(manager);
tc.getActionMap().put("undo", undoAction);
tc.getActionMap().put("redo", redoAction);
InputMap imap = tc.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK), "undo");
imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK), "redo");
JPopupMenu popup = new JPopupMenu();
popup.add(cutAction);
popup.add(copyAction);
popup.add(pasteAction);
popup.add(deleteAction);
popup.addSeparator();
popup.add(undoAction);
popup.add(redoAction);
popup.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
undoAction.setEnabled(true);
redoAction.setEnabled(true);
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
JPopupMenu pop = (JPopupMenu)e.getSource();
JTextField field = (JTextField)pop.getInvoker();
boolean flg = field.getSelectedText()!=null;
cutAction.setEnabled(flg);
copyAction.setEnabled(flg);
deleteAction.setEnabled(flg);
undoAction.setEnabled(manager.canUndo());
redoAction.setEnabled(manager.canRedo());
}
});
tc.setComponentPopupMenu(popup);
return popup;
}
References