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);
}
}
Отлично. Спасибо. Всё работает.
ОтветитьУдалитьспасибо :)
ОтветитьУдалить