88525


現在、Javaを使ってのGUI開発を行っています。  
そこで、JButtonでキーボード上で「w」を押したときに、マウスカーソルでbuttonがクリックされたときと同じ反応になる、いわゆる「ショートカットキー」を作ろうとしていますが、やり方がわからずに、行き詰まっています。

* * *

**現状のコード：**

[code]

    import javax.swing.*;
    import java.awt.*;
    public class Main{
       public static void main (String[] args) throws Exception{
           JFrame frame = new JFrame("MyGUI");
           frame.setVisible(true);
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setSize(600,400);
           frame.setLocationRelativeTo(null);
           frame.getContentPane().setLayout(new FlowLayout());
    
           
           JButton button = new JButton("Click here or Press\"w\":)"); //ここのボタンでwを押せるようにしたい
           frame.getContentPane().add(button);
           
           
           JLabel label = new JLabel("クリックもしくはキーボード入力に反応しました。");
           frame.getContentPane().add(label);
           label.setVisible(false);
           
           button.addActionListener(e -> { //マウスカーソルだけでなく、キーボードにも反応してほしい
                    label.setVisible(true);
                });
           
       }
    }
    
[/code]

* * *

少々コードが長くなり申し訳ございません。  
ショートカットキーを作るには、どのようにすれば良いでしょうか。  
また、GUIについては初心者なため、上記のコードでどこか直したほうがいいところ、改善、参考にすべきところなどありましたら、アドバイスをいただけると嬉しいです。  
よろしくお願いいたします。


CC BY-SA 4.0
2022-04-26T00:33:57.313
88497
2022-04-26T20:04:51.747
51596
question
java
GUIでキーボードを押したときに反応する、ショートカットキーを作りたい


[GUIでボタンを押したときに、文字の出力をしたい](https://ja.stackoverflow.com/a/88304/2808)
で説明した通り、Swing
に関しては[公式チュートリアル](https://docs.oracle.com/javase/tutorial/uiswing/)で解決することが多いです。

今回の場合は [shortcut
で検索する](https://www.google.com/search?q=site%3Adocs.oracle.com%2Fjavase%2Ftutorial%2Fuiswing%2F+shortcut)と、[How
to Use Key
Bindings](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)
がヒットするかと思います。  
(また、部分的な説明は前回のページ [How to Use the Common Button
API](https://docs.oracle.com/javase/tutorial/uiswing/components/button.html#abstractbutton)
にもあるので、その説明に出てくる単語で検索することも可能でしょう。)

[code]

    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.KeyStroke;
    
    
    public class Main {
        public static void main(final String[] args) throws Exception {
            final JFrame frame = new JFrame("MyGUI");
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600, 400);
            frame.setLocationRelativeTo(null);
            frame.getContentPane().setLayout(new FlowLayout());
    
            final JLabel label = new JLabel("クリックもしくはキーボード入力に反応しました。");
            label.setVisible(false);
    
            final Action buttonClickedAction = new AbstractAction() {
                @Override
                public void actionPerformed(final ActionEvent e) {
                    label.setVisible(true);
                }
            };
    
            final JButton button = new JButton("Click here or Press\"w\":)"); //ここのボタンでwを押せるようにしたい
    
            button.addActionListener(buttonClickedAction);
    
    
            button.getInputMap().put(KeyStroke.getKeyStroke('w'), "buttonClicked");
            button.getActionMap().put("buttonClicked", buttonClickedAction);
    
            frame.getContentPane().add(button);
    
            frame.getContentPane().add(label);
    
        }
    }
    
[/code]


CC BY-SA 4.0
2022-04-26T20:04:51.747
88525
2022-04-26T20:04:51.747
2808
88497
answer