Symfoware

Symfowareについての考察blog

Java JMenuItemを表示せずに、ショートカットキーで操作する

タイトルに悩むのですが、例えばこんなソース


  1. package sample;
  2. import java.awt.Dimension;
  3. import java.awt.EventQueue;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import javax.swing.JFrame;
  7. import javax.swing.JLabel;
  8. import javax.swing.JMenu;
  9. import javax.swing.JMenuBar;
  10. import javax.swing.JMenuItem;
  11. @SuppressWarnings("serial")
  12. public class Sample extends JFrame implements ActionListener {
  13.     
  14.     private JLabel label = new JLabel();
  15.     public static void main(String[] args) {
  16.         EventQueue.invokeLater(new Runnable() {
  17.             @Override
  18.             public void run() {
  19.                 startup();
  20.             }
  21.         });
  22.     }
  23.     private static void startup() {
  24.         Sample frame = new Sample();
  25.         
  26.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  27.         frame.setSize(new Dimension(350, 150));
  28.         frame.setLocationRelativeTo(null);
  29.         frame.setVisible(true);
  30.     }
  31.     
  32.     private Sample() {
  33.         JMenuBar menuBar = new JMenuBar();
  34.         
  35.         JMenu menu = new JMenu("メニュー");
  36.         JMenuItem item = new JMenuItem("メニューの項目(a)");
  37.         //ニーモニックに「a」を指定する
  38.         item.setMnemonic('a');
  39.         
  40.         item.addActionListener(this);
  41.         
  42.         menu.add(item);
  43.         
  44.         menuBar.add(menu);
  45.         
  46.         setJMenuBar(menuBar);
  47.         
  48.         getContentPane().add(label);
  49.     }
  50.     // ショートカットが聞いているかの確認用。メニューの名称を表示
  51.     @Override
  52.     public void actionPerformed(ActionEvent e) {
  53.         if (!(e.getSource() instanceof JMenuItem)) {
  54.             return;
  55.         }
  56.         label.setText(((JMenuItem)e.getSource()).getText());
  57.     }
  58. }




MenuItemに「a」というニーモニックを割り当てています。
メニューが選択されたら、メニューの名称をラベルに表示します。

これ、メニューが閉じているときは、aを押しても反応しません。

123_01.png


こんな感じで、メニューが表示されているときにaを押すと反応してくれます。

123_02.png



そうじゃなくて、メニューが表示されていない時もキーボードで操作できないか、調べてみました。
setAcceleratorを使えば、指定できる模様。



  1. package sample;
  2. import java.awt.Dimension;
  3. import java.awt.EventQueue;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.KeyEvent;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. import javax.swing.JMenu;
  10. import javax.swing.JMenuBar;
  11. import javax.swing.JMenuItem;
  12. import javax.swing.KeyStroke;
  13. @SuppressWarnings("serial")
  14. public class Sample extends JFrame implements ActionListener {
  15.     
  16.     private JLabel label = new JLabel();
  17.     public static void main(String[] args) {
  18.         EventQueue.invokeLater(new Runnable() {
  19.             @Override
  20.             public void run() {
  21.                 startup();
  22.             }
  23.         });
  24.     }
  25.     private static void startup() {
  26.         Sample frame = new Sample();
  27.         
  28.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  29.         frame.setSize(new Dimension(350, 150));
  30.         frame.setLocationRelativeTo(null);
  31.         frame.setVisible(true);
  32.     }
  33.     
  34.     private Sample() {
  35.         JMenuBar menuBar = new JMenuBar();
  36.         
  37.         JMenu menu = new JMenu("メニュー");
  38.         JMenuItem item1 = new JMenuItem("aだけ");
  39.         JMenuItem item2 = new JMenuItem("Crtl + A");
  40.         JMenuItem item3 = new JMenuItem("Shift + A");
  41.         JMenuItem item4 = new JMenuItem("Alt + A");
  42.         JMenuItem item5 = new JMenuItem("Crtl + Shift + A");
  43.         
  44.         item1.addActionListener(this);
  45.         item2.addActionListener(this);
  46.         item3.addActionListener(this);
  47.         item4.addActionListener(this);
  48.         item5.addActionListener(this);
  49.         
  50.         item1.setAccelerator(KeyStroke.getKeyStroke('a'));
  51.         item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK));
  52.         item3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.SHIFT_DOWN_MASK));
  53.         item4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.ALT_DOWN_MASK));
  54.         item5.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK + KeyEvent.SHIFT_DOWN_MASK));
  55.         
  56.         menu.add(item1);
  57.         menu.add(item2);
  58.         menu.add(item3);
  59.         menu.add(item4);
  60.         menu.add(item5);
  61.         
  62.         menuBar.add(menu);
  63.         
  64.         setJMenuBar(menuBar);
  65.         
  66.         getContentPane().add(label);
  67.     }
  68.     // ショートカットが聞いているかの確認用。メニューの名称を表示
  69.     @Override
  70.     public void actionPerformed(ActionEvent e) {
  71.         if (!(e.getSource() instanceof JMenuItem)) {
  72.             return;
  73.         }
  74.         label.setText(((JMenuItem)e.getSource()).getText());
  75.     }
  76. }




メニューが閉じている状態でも、ちゃんと反応してくれます。

123_03.png


メニューの名称には、自動的に設定されているショートカットキーが表示されます。

123_04.png



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2012/10/28(日) 17:06:17|
  2. Java
  3. | トラックバック:1
  4. | コメント:0
  5. | 編集
次のページ