2012-11-13 8 views
15

Quindi ho notato che in awt c'è un costruttore MenuItem per aggiungere un collegamento CTRL + (una certa chiave), ma non esiste un tale costruttore per JMenuItem. Qual è il modo corretto per farlo?Come si crea una scorciatoia di menu (JMenuItem)?

ho bisogno di un equivelent di AWT:

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

ma per Swing.

+1

il problema non è raggiungibile. –

+0

[Ulteriori informazioni dai percorsi] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#mnemonic) – Brian

risposta

28

Esempio per CTRL + N.

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

Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() rendimenti tasto (Ctrl) su Windows e Linux, e la chiave di comando (⌘) su Mac OS controllano.

+0

+1 breve e dolce –

+0

Proprio quello che stavo cercando! Grazie –

+0

Prego. –

8

È sufficiente creare un KeyStroke e chiamare setAccelerator(...) sul JMenuItem in questo modo:

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

Bello vedere tutto. Grazie per aver dedicato del tempo :). –

+0

@AdrianHristov è un piacere contento di essere di aiuto –

+0

sto avendo un problema quando lo uso su un 'JMenuItem' in un' JPopupMenu' non funzionerà se non premo il 'JPopupMenu' e il menu a discesa delle opzioni appare e poi mentre mostrato funzionerà come posso andare a far funzionare il collegamento senza la necessità di premere e mostrare lo scenario non voglio usare 'rootPane.registerKeyboardAction (' è anche possibile – shareef