I have a problem with keybindings: I wrote this program, but it only detects the down arrow. how do I get it to read the keys separately? What did I do wrong?
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class KeysExample extends JFrame{
public static void main(final String args[]){
final JFrame frame = new JFrame("Frame Key");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Action actionSpace = new AbstractAction(){
public void actionPerformed(ActionEvent actionSpaceEvent){
Component temporaryLostComponent = null;
JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Spacebar");
}
};
Action actionRight = new AbstractAction(){
public void actionPerformed(ActionEvent actionRightEvent){
Component temporaryLostComponent = null;
JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Right Arrow");
}
};
Action actionLeft = new AbstractAction(){
public void actionPerformed(ActionEvent actionLeftEvent){
Component temporaryLostComponent = null;
JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Left Arrow");
}
};
Action actionUp = new AbstractAction(){
public void actionPerformed(ActionEvent actionUpEvent){
Component temporaryLostComponent = null;
JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Up Arrow");
}
};
Action actionDown = new AbstractAction(){
public void actionPerformed(ActionEvent actionDownEvent){
Component temporaryLostComponent = null;
JOptionPane.showMessageDialog(temporaryLostComponent, "Pressed Down Arrow");
}
};
JPanel content = (JPanel) frame.getContentPane();
KeyStroke space = KeyStroke.getKeyStroke("SPACE");
KeyStroke right = KeyStroke.getKeyStroke("RightArrow");
KeyStroke left = KeyStroke.getKeyStroke("LeftArrow");
KeyStroke up = KeyStroke.getKeyStroke("UpArrow");
KeyStroke down = KeyStroke.getKeyStroke("DownArrow");
InputMap inputMap = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(space, "OPEN");
inputMap.put(right, "OPEN");
inputMap.put(left, "OPEN");
inputMap.put(up, "OPEN");
inputMap.put(down, "OPEN");
content.getActionMap().put("OPEN", actionSpace);
content.getActionMap().put("OPEN", actionRight);
content.getActionMap().put("OPEN", actionLeft);
content.getActionMap().put("OPEN", actionUp);
content.getActionMap().put("OPEN", actionDown);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
Also, I know the code is somewhat extensive and some of the lines are probably redundant. I'm a beginner, so I still have a lot to learn about this stuff. I also realize that nothing displays in the window I created with JFrame, that is going to come later. For know I need to fix this problem.
but it only detects the down arrow.
This is because you assign all the Strokes to the "OPEN" keyword and the last Action you assign to the "OPEN" keyword is the downAction.
Each InputMap/ActionMap pairing must have a unique keyword name (like "UP", "DOWN", "RIGHT"...).
KeyStroke.getKeyStroke("");
Also, you can't just make up Strings for the KeyStroke. You must use the names define in the KeyEvent class:
KeyEvent.VK_UP becomes "UP"
KeyEvent.VK_DOWN becomes "DOWN"
etc..
Read the API for the exact format of the String.
You may want to check out Motion Using the Keyboard for more information and examples.