2012-11-13 18 views
15

Tak więc zauważyłem, że istnieje konstruktor MenuItem do dodawania skrótu CTRL + (niektóre klawisze), ale nie ma takiego konstruktora dla JMenuItem. Jaki jest prawidłowy sposób to zrobić?Jak utworzyć skrót do elementu menu (JMenuItem)?

Potrzebuję equivelent z AWT:

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

ale dla Swing.

+1

problem jest nieosiągalny. –

+0

[Więcej informacji ze szlaków] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#mnemonic) – Brian

Odpowiedz

28

Przykład dla CTRL + N.

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

Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() powraca kontrolować klucz (Ctrl) w systemach Windows i Linux, a klawisz Command (⌘) na Mac OS.

+0

+1 krótki i słodki –

+0

Właśnie tego szukałem! Dzięki –

+0

Nie ma za co. –

8

Wystarczy utworzyć KeyStroke i nazywają setAccelerator(...) na JMenuItem tak:

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

Miło zobaczyć całość. Dzięki za poświęcenie czasu :). –

+0

@AdrianHristov jest przyjemnością cieszącą się z pomocy –

+0

Mam problem z używaniem tego na 'JMenuItem' w' JPopupMenu' nie będzie działać, dopóki nie naciśnie na 'JPopupMenu' i pojawi się lista opcji, a następnie pokazał, że to zadziała, jak mogę zrobić, aby skrót działał bez potrzeby naciskania i pokazywania scenariusza, i nie chcę używać 'rootPane.registerKeyboardAction (' jest to możliwe – shareef