2010-05-08 25 views
1

我做了一个基于Java Swing的应用程序。
在我的应用程序上,如果我点击JFrame或任何地方的任何地方,那么我的右键单击不工作?
我没有设置这样的东西..那么为什么不工作?
为什么右键单击不能在java应用程序上工作?

基本上我的键盘不能正常工作的话,我尝试复制 - 使用鼠标,然后粘贴数据,我才要知道......我右键单击不工作在我的应用程序的任何区域...

回答

29

你的右键单击工作得很好 - 在Swing中,通常不会获得你在其他应用中使用的上下文菜单。如果你想有一个弹出式菜单,例如用剪切/复制/粘贴操作右键单击,你必须自己实现它。我用我的应用程序是这样的:

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

太棒了!正是我在找的东西。对于任何新手而言,将其作为一个新文件添加到您的项目中,然后在您的txt组件上,像这样说: txtDescription.addMouseListener(new ContextMenuMouseListener()); – Richard 2012-01-07 14:03:43

+0

完美,感谢分享。我已经在这里使用过你的课程:http://stackoverflow.com/a/11915456/549510 – Kingsolmn 2012-08-11 14:20:53

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); 
相关问题