栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java KeyListener未注册箭头键

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java KeyListener未注册箭头键

是的,你将看到箭头键响应keyPressed和keyReleased,而不是keyTyped。我的SSCCE:

import java.awt.Dimension;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import javax.swing.*;public class ArrowTest extends JPanel {   private static final int PREF_W = 400;   private static final int PREF_H = PREF_W;   public ArrowTest() {      setFocusable(true);      requestFocusInWindow();      addKeyListener(new KeyAdapter() {         @Override         public void keyTyped(KeyEvent e) { myKeyEvt(e, "keyTyped");         }         @Override         public void keyReleased(KeyEvent e) { myKeyEvt(e, "keyReleased");         }         @Override         public void keyPressed(KeyEvent e) { myKeyEvt(e, "keyPressed");         }         private void myKeyEvt(KeyEvent e, String text) { int key = e.getKeyCode(); System.out.println("TEST"); if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_LEFT) {     System.out.println(text + " LEFT");     //Call some function } else if (key == KeyEvent.VK_KP_RIGHT || key == KeyEvent.VK_RIGHT) {     System.out.println(text + " RIGHT");     //Call some function }         }      });   }   @Override   public Dimension getPreferredSize() {      return new Dimension(PREF_W, PREF_H);   }   private static void createAndShowGui() {      ArrowTest mainPanel = new ArrowTest();      Jframe frame = new Jframe("ArrowTest");      frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);      frame.getContentPane().add(mainPanel);      frame.pack();      frame.setLocationByPlatform(true);      frame.setVisible(true);   }   public static void main(String[] args) {      SwingUtilities.invokeLater(new Runnable() {         public void run() { createAndShowGui();         }      });   }}

因此,要解决此问题,如果要侦听箭头事件,请重写keyPressed而不是keyTyped。

或寻求更好的解决方案:使用键绑定

编辑
我的键绑定版本:

import java.awt.Dimension;import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import javax.swing.*;@SuppressWarnings("serial")public class ArrowTest extends JPanel {   private static final int PREF_W = 400;   private static final int PREF_H = PREF_W;   public ArrowTest() {      ActionMap actionMap = getActionMap();      int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;      InputMap inputMap = getInputMap(condition);      for (Direction direction : Direction.values()) {         inputMap.put(direction.getKeyStroke(), direction.getText());         actionMap.put(direction.getText(), new MyArrowBinding(direction.getText()));      }   }   private class MyArrowBinding extends AbstractAction {      public MyArrowBinding(String text) {         super(text);         putValue(ACTION_COMMAND_KEY, text);      }      @Override      public void actionPerformed(ActionEvent e) {         String actionCommand = e.getActionCommand();         System.out.println("Key Binding: " + actionCommand);      }   }   @Override   public Dimension getPreferredSize() {      return new Dimension(PREF_W, PREF_H);   }   private static void createAndShowGui() {      ArrowTest mainPanel = new ArrowTest();      Jframe frame = new Jframe("ArrowTest");      frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);      frame.getContentPane().add(mainPanel);      frame.pack();      frame.setLocationByPlatform(true);      frame.setVisible(true);   }   public static void main(String[] args) {      SwingUtilities.invokeLater(new Runnable() {         public void run() { createAndShowGui();         }      });   }}enum Direction {   UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)),   DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)),   LEFt("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)),   RIGHt("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0));   Direction(String text, KeyStroke keyStroke) {      this.text = text;      this.keyStroke = keyStroke;   }   private String text;   private KeyStroke keyStroke;   public String getText() {      return text;   }   public KeyStroke getKeyStroke() {      return keyStroke;   }   @Override   public String toString() {      return text;   }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573185.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号