最近看到有人问怎么模拟钢琴操作
想了想怎么实现 顺便看了下键盘事件
可以用两种方式
1、
public class KeystrokeTest extends JApplet {
private JButton button = new JButton("button");
public void init() {
Container contentPane = getContentPane();
JPanel panel = new JPanel();
JCheckBox checkbox = new JCheckBox("checkbox");
JButton southButton = new JButton("south button");
Listener listener = new Listener();
panel.setBorder(BorderFactory
.createTitledBorder(("Ancestor of button and checkbox")));
checkbox.registerKeyboardAction(listener, KeyStroke.getKeyStroke(
KeyEvent.VK_F, 0, false), JComponent.WHEN_FOCUSED);
panel.registerKeyboardAction(listener, KeyStroke.getKeyStroke(
KeyEvent.VK_A, InputEvent.ALT_MASK, false),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
southButton.registerKeyboardAction(listener, KeyStroke.getKeyStroke(
KeyEvent.VK_W, 0, true), JComponent.WHEN_IN_FOCUSED_WINDOW);
panel.add(button);
panel.add(checkbox);
contentPane.add(panel, "Center");
contentPane.add(southButton, "South");
}
}
class Listener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
String cname = src.getClass().getName();
if (src instanceof JCheckBox) {
System.out.print("'f' key PRESSED when checkbox");
System.out.println(" had focus");
} else if (src instanceof JPanel) {
System.out.print("'ALT-a' key PRESSED when ancestor");
System.out.println(" of titled panel had focus");
} else if (src instanceof JButton) {
System.out.print("'w' key RELEASED when any");
System.out.println(" component in window had focus");
}
System.out.println("Source: " + cname);
System.out.println();
}
}
2、
public class T {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
final JTextField tf = new JTextField();
tf.setEnabled(false);
JPanel p = new JPanel(new GridLayout(0, 3, 5, 5));
for (int i = 0; i <= 9; i++) {
final JButton btn = new JButton(String.valueOf(i));
p.add(btn);
btn.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke((char) (i + '0')), "PressKeyAction");
btn.getActionMap().put("PressKeyAction", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
btn.doClick();
}
});
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText(tf.getText() + btn.getText());
}
});
}
JFrame f = new JFrame();
JComponent contentPane = (JComponent) f.getContentPane();
contentPane.setLayout(new BorderLayout(0, 5));
contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
f.getContentPane().add(p, BorderLayout.CENTER);
f.getContentPane().add(tf, BorderLayout.NORTH);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
看了下java的源代码发现registerKeyboardAction方法其实就是把
btn.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke((char) (i + '0')), "PressKeyAction");
btn.getActionMap().put("PressKeyAction", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
btn.doClick();
}
});封装了一下
public void registerKeyboardAction(ActionListener anAction,String aCommand,KeyStroke aKeyStroke,int aCondition) {
InputMap inputMap = getInputMap(aCondition, true);
if (inputMap != null) {
ActionMap actionMap = getActionMap(true);
ActionStandin action = new ActionStandin(anAction, aCommand);
inputMap.put(aKeyStroke, action);
if (actionMap != null) {
actionMap.put(action, action);
}
}
}
不过api中提到
registerKeyboardAction方法现在已过时,对于类似的操作,请结合使用 getActionMap()
和 getInputMap(),即第二种方法为java推荐的方法
好像在哪看到过java中不提倡使用addKeyListener();
知道的可以说以下