2011-07-18 49 views
4

我創建一個JFrame並放入一個JMenuBar,添加一個帶有「Ctrl + C」加速器的「複製」菜單項。完整的源代碼粘貼在下面。當我在JFrame中拖放時,我可以看到「Ctrl + C」加速器被觸發(因爲ActionEvent被打印在控制檯中),就像你在鍵盤上按下Ctrl + C一樣。Java Swing:爲什麼在JFrame中拖放會觸發「Ctrl + C」加速器?

我認爲這是非常奇怪的行爲,我不明白爲什麼鼠標操縱會觸發該熱鍵。這是一個錯誤嗎?

public class Test { 
    public static void main(String[] args) { 
     final JFrame jf = new JFrame("Test"); 
     final JMenuBar menuBar = new JMenuBar(); 
     jf.setJMenuBar(menuBar); 
     final JMenu menu = new JMenu("Edit"); 
     menuBar.add(menu); 
     final JMenuItem copyItem = new JMenuItem("Copy"); 
     copyItem.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println(e); 
      } 
     }); 
     copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK)); 
     menu.add(copyItem); 
     jf.setPreferredSize(new Dimension(400, 300)); 
     jf.pack(); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setVisible(true); 
    } 
} 
+3

這是否與您發佈的代碼一起工作?只是問,因爲上次我嘗試在Java中進行拖放時,它需要使用「TransferHandler」的相當多的代碼。 –

+0

我第二次詹姆斯的發言。我無法用上面的發佈代碼重現您的問題,也許是因爲它不允許拖放操作。 –

+0

你正在使用哪個操作系統? –

回答

1

前幾天我有一個類似的問題。但我已解決它更改KeyEvent.CTRL_DOWN_MASKEvent.CTRL_MASK參數。我的最終代碼爲以下幾點:

sousMenu = new JMenuItem("Nouveau", KeyEvent.VK_N); 
    sousMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 
             KeyEvent.CTRL_DOWN_MASK)); 
    sousMenu.setName(Modele.ID_NOUVEAU); 
    sousMenu.addActionListener(this); 
    menu.add(sousMenu); 
    /** Modele is a singleton class with my constants 
    * My frame class implements ActionListener 
    * The KeyEvent.VK_N parameter in the constructor sets the mnemonic 
    */ 

我不知道這是一個衆所周知的錯誤,但我選擇在我的情況下工作沒有任何問題。

祝你好運!