2012-11-13 31 views
15

Vì vậy, tôi nhận thấy rằng trong awt có một constructor MenuItem để thêm một lối tắt CTRL + (một số khóa), nhưng không có hàm tạo nào như vậy cho JMenuItem. cách chính xác để làm điều này là gì?Làm cách nào để bạn tạo lối tắt mục menu (JMenuItem)?

Tôi cần một equivelent của AWT:

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

nhưng đối với Swing.

+1

vấn đề là không thể truy cập. –

+0

[Thông tin thêm từ các đường nhỏ] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#mnemonic) – Brian

Trả lời

28

Ví dụ cho CTRL + N.

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

Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() lợi nhuận điều khiển chính (ctrl) trên Windows và Linux, và phím lệnh (⌘) trên Mac OS.

+0

+1 ngắn và ngọt –

+0

Chỉ cần những gì tôi đang tìm kiếm! Cảm ơn –

+0

Bạn được chào đón. –

8

Đơn giản chỉ cần tạo ra một KeyStroke và gọi setAccelerator(...) trên JMenuItem như vậy:

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

Rất vui được thấy toàn bộ sự việc. Cảm ơn đã dành thời gian :). –

+0

@AdrianHristov vui mừng khi được giúp đỡ –

+0

đang gặp sự cố khi sử dụng tính năng này trên một 'JPenuItem' trong một' JPopupMenu' nó sẽ không hoạt động trừ khi tôi nhấn vào 'JPopupMenu' và thả xuống các tùy chọn xuất hiện và sau đó trong khi cho thấy nó sẽ làm việc như thế nào tôi có thể đi làm cho các phím tắt làm việc mà không cần phải bấm và hiển thị kịch bản tôi không muốn sử dụng 'rootPane.registerKeyboardAction (' là thậm chí có thể – shareef

Các vấn đề liên quan