package rva.common.gui.mouse; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import javax.swing.Action; import javax.swing.JPopupMenu; import javax.swing.text.JTextComponent; /** * MouseListener c командами копировать, вырезать, вставить, выделить все - для JTextComponent * @author Cloud */ public class ContextMenuMouseListener extends MouseAdapter { private final static String CUTTEXT = "Вырезать"; private final static String SELECTAllTEXT = "Выделить все"; private final static String COPYTEXT = "Копировать"; private final static String PASTETEXT = "Вставить"; @Override public void mouseClicked(MouseEvent e) { if (e.getModifiers() == InputEvent.BUTTON3_MASK) { if (!(e.getSource() instanceof JTextComponent)) { return; } JTextComponent textComponent = (JTextComponent) e.getSource(); textComponent.requestFocus(); boolean enabled = textComponent.isEnabled(); boolean editable = textComponent.isEditable(); boolean nonempty = !(textComponent.getText() == null || textComponent.getText().equals("")); boolean marked = textComponent.getSelectedText() != null; boolean pasteAvailable = Toolkit.getDefaultToolkit().getSystemClipboard(). getContents(null).isDataFlavorSupported( DataFlavor.stringFlavor); JPopupMenu popup = new JPopupMenu(); if (enabled && editable && marked) { Action cutAction = textComponent.getActionMap().get(DefaultEditorKit.cutAction); if (cutAction == null) { cutAction = textComponent.getActionMap().get("cut"); } if (cutAction != null) { popup.add(cutAction).setText(CUTTEXT); } } if (enabled && marked) { Action copyAction = textComponent.getActionMap().get(DefaultEditorKit.copyAction); if (copyAction == null) { copyAction = textComponent.getActionMap().get("copy"); } if (copyAction != null) { popup.add(copyAction).setText(COPYTEXT); } } if (enabled && editable && pasteAvailable) { Action pasteAction = textComponent.getActionMap().get(DefaultEditorKit.pasteAction); if (pasteAction == null) { pasteAction = textComponent.getActionMap().get("paste"); } if (pasteAction != null) { popup.add(pasteAction).setText(PASTETEXT); } } if (enabled && nonempty) { Action selectAllAction = textComponent.getActionMap().get(DefaultEditorKit.selectAllAction); if (selectAllAction == null) { selectAllAction = textComponent.getActionMap().get("selectAll"); } if (selectAllAction != null) { if (popup.getComponentCount() > 0) { if (!(popup.getComponent(popup.getComponentCount() - 1) instanceof JPopupMenu.Separator)) { popup.addSeparator(); } } popup.add(selectAllAction).setText(SELECTAllTEXT); } } if (popup.getComponentCount() > 0) { if (popup.getComponent(0) instanceof JPopupMenu.Separator) { popup.remove(0); } if (popup.getComponent(popup.getComponentCount() - 1) instanceof JPopupMenu.Separator) { popup.remove(popup.getComponentCount() - 1); } popup.show(e.getComponent(), e.getX(), e.getY() - popup.getSize().height); } } } }
Вышепреведенное меню обычно имеет смысл добавить ко всем текстовым компонентам приложения. Сделать это можно следующим рекурсивным методом (после инициализации всех компонентов).
private static void iterateAllInterfaceComponentsAndAddContextMenuMouseListener( Component component) { if (component instanceof JTextComponent) { ((JTextComponent)component).addMouseListener(new ContextMenuMouseListener()); } if (component instanceof Container) { for (Component c : ((Container) component).getComponents()) { iterateAllInterfaceComponentsAndAddContextMenuMouseListener(c); } } }
Украду :)
ОтветитьУдалитьна здоровье))
УдалитьА можно пример в коде по рекурсивному методу? А то у меня не работает. ContextMenuMouseListener отдельно работает, а iterateAllInterfaceComponentsAndAddContextMenuMouseListener нет.
ОтветитьУдалитьда, конечно
Удалитьpublic class SomeFrame extends javax.swing.JFrame {
public SomeFrame () {
// creation of content of frame
// .....
// call of the method (passing JFrame instance as parameter)
iterateAllInterfaceComponentsAndAddContextMenuMouseListener(this);
}
}
Отлично. Спасибо. Всё работает.
ОтветитьУдалитьспасибо :)
ОтветитьУдалить