Generally speaking, where you have a limited set of key inputs, key bindings are a better choice.
KeyListener
suffers from issues related to focusability and with other controls in the GUI, focus will constantly be moving away from the component (with the KeyListener
) all the time.
A simple solution would be to use the Action
s API. This allows you to define a self contained "action" which acts as a ActionListener
but also carries configuration information that can be used to configure other UI components, in particular, buttons
For example...
Take a generic NumberAction
which could represent any number (lets limit it to 0-9 for now)...
public class NumberAction extends AbstractAction {
private int number;
public NumberAction(int number) {
putValue(NAME, String.valueOf(number));
}
public int getNumber() {
return number;
}
@Override
public void actionPerformed(ActionEvent e) {
int value = getNumber();
// Do something with the number...
}
}
You could do something like...
// Create the action...
NumberAction number1Action = new NumberAction(1);
// Create the button for number 1...
JButton number1Button = new JButton(number1Action);
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
// Create a key mapping for number 1...
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "number1");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0), "number1");
ActionMap am = getActionMap();
// Make the input key to the action...
am.put("number1", number1Action);
And you're done...
You can also create any number of instance of the NumberAction
for the same number, meaning you could configure the UI and the bindings separately, but know that when triggered, they will execute the same code logic, for example...
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…