2012-11-13 50 views
15

所以我注意到,在awt中有一個MenuItem構造函數用於添加CTRL +(一些關鍵)快捷方式,但JMenuItem沒有這樣的構造函數。什麼是正確的方法來做到這一點?如何讓菜單項(JMenuItem)快捷方式?

我需要AWT的equivelent:

MenuItem mi = new MenuItem("Copy", new MenuShortcut(KeyEvent.VK_C)); 

但搖擺。

+1

問題不可達。 –

+0

[詳細信息](http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#mnemonic) – Brian

回答

28

的示例CTRL + N

menuItem.setAccelerator(KeyStroke.getKeyStroke('N', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); 

Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()返回控制在Mac OS在Windows和Linux,以及命令鍵(⌘)鍵(CTRL)。

+0

+1短而甜 –

+0

正是我在尋找的!謝謝 –

+0

不客氣。 –

8

只需創建一個KeyStroke,並呼籲setAccelerator(...)JMenuItem像這樣:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.InputEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.KeyStroke; 
import javax.swing.SwingUtilities; 
import java.awt.Toolkit; 

public class Test { 

    public Test() { 
     initComponents(); 
    } 

    public static void main(String[] args) { 
     //create Swing components on EDT 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 

    private void initComponents() { 
     //create JFrame 
     JFrame frame = new JFrame("Accelerator Sample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JMenuBar menuBar = new JMenuBar();//create menu bar to hold menus 
     JMenu menu = new JMenu("File");//create a menu 
     menuBar.add(menu);//add menu to bar 

     JMenuItem menuItem = new JMenuItem("Say Hello");//create menu item 

     //set shortcut CTRL+H (command+h on mac os) 
     KeyStroke ctrlH = KeyStroke.getKeyStroke(KeyEvent.VK_H, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()); 

     //set the accelerator 
     menuItem.setAccelerator(ctrlH); 
     //add listener which will be called when shortcut is pressed 
     menuItem.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent actionEvent) { 
       System.out.println("Hello, World"); 
      } 
     }); 

     menu.add(menuItem);//add item to menu 'File' 

     frame.setJMenuBar(menuBar);//set menubar of JFrame 
     frame.pack(); 
     frame.setVisible(true);//set frame visible 
    } 
} 
+1

很高興看到整個事情。感謝您抽出寶貴的時間 :)。 –

+0

@AdrianHristov高興地幫忙 –

+0

當在JPopupMenu的'JMenuItem'上使用它時會出現問題,除非我按下'JPopupMenu'並且出現選項的下拉菜單,顯示它會工作,我怎麼可以做快捷方式的工作,而不需要按和顯示場景,我不想使用'rootPane.registerKeyboardAction('是甚至可能的 – shareef