2010-05-08 2 views
1

Я сделал одно приложение на основе Java Swing.
В моем приложении, если я нажимаю в любом месте JFrame или что-то еще, то мой правый клик не работает?
Я не устанавливал ничего подобного ... тогда почему это не работает?
Почему правый клик не работает над java-приложением?

В основном мой ключ плата не работает, то я стараюсь копировать - вставлять данные, используя мышь, то, я пришел о знать, что ... мой правая кнопка мышь не работает на любом участке моего приложения ...

ответ

29

Ваш правый щелчок работает очень хорошо - в Swing это нормально, чтобы не получать контекстные меню, к которым вы привыкли в других приложениях. Если вы хотите иметь всплывающее меню, которое открывается, щелкнув правой кнопкой мыши с помощью действий cut/copy/paste, например, вы должны реализовать его самостоятельно. Я использую что-то вроде этого в моих программах:

public class ContextMenuMouseListener extends MouseAdapter { 
    private JPopupMenu popup = new JPopupMenu(); 

    private Action cutAction; 
    private Action copyAction; 
    private Action pasteAction; 
    private Action undoAction; 
    private Action selectAllAction; 

    private JTextComponent textComponent; 
    private String savedString = ""; 
    private Actions lastActionSelected; 

    private enum Actions { UNDO, CUT, COPY, PASTE, SELECT_ALL }; 

    public ContextMenuMouseListener() { 
     undoAction = new AbstractAction("Undo") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
        textComponent.setText(""); 
        textComponent.replaceSelection(savedString); 

        lastActionSelected = Actions.UNDO; 
      } 
     }; 

     popup.add(undoAction); 
     popup.addSeparator(); 

     cutAction = new AbstractAction("Cut") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       lastActionSelected = Actions.CUT; 
       savedString = textComponent.getText(); 
       textComponent.cut(); 
      } 
     }; 

     popup.add(cutAction); 

     copyAction = new AbstractAction("Copy") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       lastActionSelected = Actions.COPY; 
       textComponent.copy(); 
      } 
     }; 

     popup.add(copyAction); 

     pasteAction = new AbstractAction("Paste") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       lastActionSelected = Actions.PASTE; 
       savedString = textComponent.getText(); 
       textComponent.paste(); 
      } 
     }; 

     popup.add(pasteAction); 
     popup.addSeparator(); 

     selectAllAction = new AbstractAction("Select All") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       lastActionSelected = Actions.SELECT_ALL; 
       textComponent.selectAll(); 
      } 
     }; 

     popup.add(selectAllAction); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     if (e.getModifiers() == InputEvent.BUTTON3_MASK) { 
      if (!(e.getSource() instanceof JTextComponent)) { 
       return; 
      } 

      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); 

      undoAction.setEnabled(enabled && editable && (lastActionSelected == Actions.CUT || lastActionSelected == Actions.PASTE)); 
      cutAction.setEnabled(enabled && editable && marked); 
      copyAction.setEnabled(enabled && marked); 
      pasteAction.setEnabled(enabled && editable && pasteAvailable); 
      selectAllAction.setEnabled(enabled && nonempty); 

      int nx = e.getX(); 

      if (nx > 500) { 
       nx = nx - popup.getSize().width; 
      } 

      popup.show(e.getComponent(), nx, e.getY() - popup.getSize().height); 
     } 
    } 
} 

В конце концов, вы должны прикрепить этот слушатель любых текстовых компонентов, которые вы хотите иметь контекстное меню на правой кнопке мыши.

+1

Fantastic! Только то, что я искал. Для любых новичков, добавьте это как новый файл в свой проект, затем на свой компонент txt скажите примерно так: txtDescription.addMouseListener (новый ContextMenuMouseListener()); – Richard

+0

Отлично, спасибо, что поделились этим. Я использовал ваш класс для ответа здесь: http://stackoverflow.com/a/11915456/549510 – Kingsolmn

2

Вы не имеете контекстного меню? В приложениях Swing вы должны сами добавить контекстное меню. Для получения дополнительной информации см. this article.

1
class Popup extends JPopupMenu 
{ 
    final static long serialVersionUID = 0; 

    Clipboard clipboard; 

    UndoManager undoManager; 

    JMenuItem jmenuItem_undo; 
    JMenuItem jmenuItem_cut; 
    JMenuItem jmenuItem_copy; 
    JMenuItem jmenuItem_paste; 
    JMenuItem jmenuItem_delete; 
    JMenuItem jmenuItem_selectAll; 

    JTextComponent jtextComponent; 

    public Popup() 
    { 
     undoManager = new UndoManager(); 

     clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 

     jmenuItem_undo = new JMenuItem("undo"); 
     jmenuItem_undo.setEnabled(false); 
     jmenuItem_undo.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       undoManager.undo(); 
      } 
     }); 

     this.add(jmenuItem_undo); 

     this.add(new JSeparator()); 

     jmenuItem_cut = new JMenuItem("cut"); 
     jmenuItem_cut.setEnabled(false); 
     jmenuItem_cut.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       jtextComponent.cut(); 
      } 
     }); 

     this.add(jmenuItem_cut); 

     jmenuItem_copy = new JMenuItem("copy"); 
     jmenuItem_copy.setEnabled(false); 
     jmenuItem_copy.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       jtextComponent.copy(); 
      } 
     }); 

     this.add(jmenuItem_copy); 

     jmenuItem_paste = new JMenuItem("paste"); 
     jmenuItem_paste.setEnabled(false); 
     jmenuItem_paste.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       jtextComponent.paste(); 
      } 
     }); 

     this.add(jmenuItem_paste); 

     jmenuItem_delete = new JMenuItem("delete"); 
     jmenuItem_delete.setEnabled(false); 
     jmenuItem_delete.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       jtextComponent.replaceSelection(""); 
      } 
     }); 

     this.add(jmenuItem_delete); 

     this.add(new JSeparator()); 

     jmenuItem_selectAll = new JMenuItem("select all"); 
     jmenuItem_selectAll.setEnabled(false); 
     jmenuItem_selectAll.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       jtextComponent.selectAll(); 
      } 
     }); 

     this.add(jmenuItem_selectAll); 
    } 

    public void add(JTextComponent jtextComponent) 
    { 
     jtextComponent.addMouseListener(new MouseAdapter() 
     { 
      public void mouseReleased(MouseEvent event) 
      { 
       if (event.getButton() == 3) 
       { 
        processClick(event); 
       } 
      } 
     }); 

     jtextComponent.getDocument().addUndoableEditListener(new UndoableEditListener() 
     { 
      public void undoableEditHappened(UndoableEditEvent event) 
      { 
       undoManager.addEdit(event.getEdit()); 
      } 
     }); 
    } 

    private void processClick(MouseEvent event) 
    { 
     jtextComponent = (JTextComponent)event.getSource(); 

     boolean enableUndo = undoManager.canUndo(); 
     boolean enableCut = false; 
     boolean enableCopy = false; 
     boolean enablePaste = false; 
     boolean enableDelete = false; 
     boolean enableSelectAll = false; 

     String selectedText = jtextComponent.getSelectedText(); 
     String text = jtextComponent.getText(); 

     if (text != null) 
     { 
      if (text.length() > 0) 
      { 
       enableSelectAll = true; 
      } 
     } 

     if (selectedText != null) 
     { 
      if (selectedText.length() > 0) 
      { 
       enableCut = true; 
       enableCopy = true; 
       enableDelete = true; 
      } 
     } 

     try 
     { 
      if (clipboard.getData(DataFlavor.stringFlavor) != null) 
      { 
       enablePaste = true; 
      } 
     } 
     catch (Exception exception) 
     { 
      System.out.println(exception); 
     } 

     jmenuItem_undo.setEnabled(enableUndo); 
     jmenuItem_cut.setEnabled(enableCut); 
     jmenuItem_copy.setEnabled(enableCopy); 
     jmenuItem_paste.setEnabled(enablePaste); 
     jmenuItem_delete.setEnabled(enableDelete); 
     jmenuItem_selectAll.setEnabled(enableSelectAll); 

     this.show(jtextComponent,event.getX(),event.getY()); 
    } 
} 


и реализовать его,

Popup popup = new Popup(); 

JTextArea jtextArea; 
JTextField jtextField; 

popup.add(jtextArea); 
popup.add(jtextField); 
Смежные вопросы