程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java的鍵盤事件

java的鍵盤事件

編輯:關於JAVA

最近看到有人問怎麼模擬鋼琴操作

想了想怎麼實現 順便看了下鍵盤事件

可以用兩種方式

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();

知道的可以說以下

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved