Full working model for any JTextComponent, including non-functional actions and turning on / off menu items subject to text selection.
private JMenuItem composeMenuItemFromActionOfComponent(String actionTag, JComponent component, String text, String idTag){ Action action = component.getActionMap().get(actionTag); JMenuItem menuItem = new JMenuItem(action); menuItem.setText(text); menuItem.putClientProperty("id",idTag); if(action == null) menuItem.setEnabled(false); return menuItem; } private void addTextMenuItems(JTextComponent textField){ final JPopupMenu popup = new JPopupMenu(); if(textField.isEditable()) { popup.add(composeMenuItemFromActionOfComponent("undo", textField, "Undo", "undo")); popup.addSeparator(); } popup.add (composeMenuItemFromActionOfComponent(DefaultEditorKit.copyAction,textField,"Copy", "copy")); if(textField.isEditable()) { popup.add(composeMenuItemFromActionOfComponent(DefaultEditorKit.cutAction, textField, "Cut", "cut")); popup.add(composeMenuItemFromActionOfComponent(DefaultEditorKit.pasteAction, textField, "Paste", "paste")); popup.addSeparator(); } popup.add (composeMenuItemFromActionOfComponent(DefaultEditorKit.selectAllAction,textField,"Select All", "select_all")); textField.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) {} @Override public void mousePressed(MouseEvent e) {} @Override public void mouseReleased(MouseEvent e) { if(e.isPopupTrigger()) { boolean isTextSelected = textField.getSelectedText() != null; for(MenuElement element : popup.getSubElements()){ JMenuItem menuItem = ((JMenuItem) element); if(menuItem.getAction() != null && menuItem.getAction().isEnabled()) { if (isTextSelected){ menuItem.setEnabled(true); }else if (!(menuItem.getClientProperty("id").equals("select_all") || menuItem.getClientProperty("id").equals("undo"))) menuItem.setEnabled(false); } if(menuItem.getClientProperty("id").equals("paste")){ boolean isPastAvailable = false; for(DataFlavor flavor : Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors()){ if(flavor.getRepresentationClass() == String.class){ isPastAvailable = true; break; } } menuItem.setEnabled(isPastAvailable); } } e.getComponent().requestFocus(); popup.show(e.getComponent(), e.getX(), e.getY()); } } @Override public void mouseEntered(MouseEvent e) {} @Override public void mouseExited(MouseEvent e) {} }); }
source share