Swing


          天行健 君子以自強不息

          posts - 69, comments - 215, trackbacks - 0, articles - 16
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java鍵盤事件

          Posted on 2007-05-26 10:28 zht 閱讀(6400) 評論(0)  編輯  收藏 所屬分類: Swing

          最近看到有人問怎么模擬鋼琴操作
          想了想怎么實現 順便看了下鍵盤事件
          可以用兩種方式
          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();
          知道的可以說以下

          主站蜘蛛池模板: 封丘县| 常熟市| 凌源市| 从化市| 阜阳市| 潼关县| 太湖县| 安化县| 油尖旺区| 新民市| 铁岭县| 九江市| 桃源县| 襄城县| 确山县| 临沂市| 瓦房店市| 长阳| 洛浦县| 兴仁县| 乐平市| 二连浩特市| 宁安市| 克拉玛依市| 隆昌县| 砀山县| 延安市| 苏尼特左旗| 福海县| 湖南省| 曲松县| 徐州市| 石首市| 沙坪坝区| 涿鹿县| 鸡西市| 林州市| 濮阳县| 漯河市| 邹平县| 峡江县|