views:

392

answers:

3

In the following program, why does hitting the 'a' key print "hello, world" while hitting 'CTRL-a' doesn't?

import java.awt.event.*;
import javax.swing.*;

public class KeyStrokeTest {
    public static void main(String[] args) {
        JPanel panel = new JPanel();

        /* add a new action named "foo" to the panel's action map */
        panel.getActionMap().put("foo", new AbstractAction() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("hello, world");
                }
            });

        /* connect two keystrokes with the newly created "foo" action:
           - a
           - CTRL-a
        */
        InputMap inputMap = panel.getInputMap();
        inputMap.put(KeyStroke.getKeyStroke(Character.valueOf('a'), 0), "foo");
        inputMap.put(KeyStroke.getKeyStroke(Character.valueOf('a'), InputEvent.CTRL_DOWN_MASK), "foo");

        /* display the panel in a frame */
        JFrame frame = new JFrame();
        frame.getContentPane().add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }
}

How could I fix it that CTRL-a works as well?

Thanks!

+2  A: 

I find it easier to use:

KeyStroke a = KeyStroke.getKeyStroke("A");
KeyStroke controlA = KeyStroke.getKeyStroke("control A");

or:

KeyStroke controlA = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);
camickr
+3  A: 

Dude, use this

inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK), "foo");
Bragboy
Dude, thanks! Your solution works, however I still wonder why mine doesn't...
Thomas
Interesting I made my suggestion before this posting, plus I gave you other alternatives that you might be able to use in different situations. I guess I won't go to all the trouble the next time.
camickr
@Thomas: I dont know whether I am correct, but the reason that your code might have not worked because in the first case, you were referring to a simple character 'a'. Where-in in the second case you are referring a combination of keys which is an ASCII and a scan value(Ctrl key). I feel it should have been associated with events properly.
Bragboy
@camickr - I'm sorry, that was an honest mistake.
Thomas
A: 

Yep, the above code will work.

Big picture - 'CTRL-a' and 'a' are read as different keystrokes the same as 'a' and 'b' would be different.

SOA Nerd
The OP knows "Ctrl-A" and "A" are different keystrokes.
camickr