2010-05-08 8 views
1

J'avais fait une application Java Swing.
Sur mon application, si je clique n'importe où sur le JFrame ou quoi que ce soit, alors mon clic droit ne fonctionne pas?
Je n'avais pas défini quelque chose comme ça .. alors pourquoi ne fonctionne pas?
Pourquoi le clic droit ne fonctionne pas sur l'application java?

Fondamentalement, mon clavier ne fonctionnait pas alors j'essayer de copier - coller des données à l'aide de la souris puis, je suis tombé sur le point de savoir que ... mon clic droit ne fonctionne pas sur tous les domaines de ma demande ...

Répondre

29

Votre clic droit fonctionne très bien - dans Swing, il est normal de ne pas obtenir les menus contextuels auxquels vous êtes habitué dans d'autres applications. Si vous voulez avoir un menu contextuel qui s'ouvre par clic droit avec des actions couper/copier/coller par exemple - vous devez l'implémenter vous-même. J'utilise quelque chose comme ça dans mes applications:

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

En fin de compte, vous devez attacher cet écouteur à tous les composants de texte que vous souhaitez avoir un menu contextuel sur clic droit.

+1

Fantastique! Exactement ce que je cherchais. Pour les débutants, ajoutez ceci comme un nouveau fichier à votre projet, puis, sur votre composant txt, dites quelque chose comme ceci: txtDescription.addMouseListener (new ContextMenuMouseListener()); – Richard

+0

Parfait, merci de partager cela. J'ai utilisé votre classe pour une réponse ici: http://stackoverflow.com/a/11915456/549510 – Kingsolmn

2

Voulez-vous dire que vous n'avez pas de menu contextuel? Dans les applications Swing, vous devez vous-même ajouter un menu contextuel. Voir this article pour plus d'informations.

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


et de le mettre en œuvre,

Popup popup = new Popup(); 

JTextArea jtextArea; 
JTextField jtextField; 

popup.add(jtextArea); 
popup.add(jtextField); 
Questions connexes