A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 光脚丫的小白兔 中级黑马   /  2013-10-8 23:52  /  3341 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

private class Adapter extends keyAdapter
{
public void keyPressed(KeyEvent e)
{
   int vk=e.getKeyCode();
   switch(vk);
   {
    case KeyEvent.VK_0;
     actions.doThat("0");
     break;
    case KeyEvent.VK_1;
     actions.doThat("1");
     break;
    case KeyEvent.VK_2;
     actions.doThat("2");
     break;
    case KeyEvent.VK_3;
     actions.doThat("3");
     break;
    case KeyEvent.VK_4;
     actions.doThat("4");
     break;
    case KeyEvent.VK_5;
     actions.doThat("5");
     break;
    case KeyEvent.VK_6;
     actions.doThat("6");
     break;
    case KeyEvent.VK_7;
     actions.doThat("7");
     break;
    case KeyEvent.VK_8;
     actions.doThat("8");
     break;
    case KeyEvent.VK_9;
     actions.doThat("9");
     break;
    case KeyEvent.VK_PERIOD;
     actions.doThat(".");
     break;
   }
}
}

上面的代码是我覆写的keyPressed方法,执行很正常。但是如果我把这个方法改成覆写keyTyped方法,方法体还是这个方法体,除了方法名改变其他都不改变,那这个方法就执行不正常了!它好像就不会执行switch语句了,这是为什么?

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

2 个回复

正序浏览
keyPressed:键盘按下,未释放
keyTyped:键盘按下,然后释放。
返回值不同;
API原文:
对于按下键和释放键事件,getKeyCode 方法返回该事件的 keyCode。对于键入键事件,getKeyCode 方法总是返回 VK_UNDEFINED。
以前论坛有问过这个问题的,详细可以看看API
当按下、释放或键入某个键时,组件对象(如文本字段)将生成此低级别事件。该事件被传递给每一个 KeyListener 或 KeyAdapter 对象,这些对象使用组件的 addKeyListener 方法注册,以接收此类事件。(KeyAdapter 对象实现 KeyListener 接口。)发生事件时,所有此类侦听器对象都将获得此 KeyEvent。

“键入键”事件 是高级别事件,通常不依赖于平台或键盘布局。输入 Unicode 字符时生成此类事件,它们被认为是发现字符输入的最佳方式。最简单的情况是,按下单个键(如 "a")将产生键入键事件。但是,字符经常是通过一系列按键(如‘shift’+‘a’)产生的,按下键事件和键入键事件的映射关系可能是多对一或多对多的。键释放通常不需要生成键入键事件,但在某些情况下,只有释放了某个键后才能生成键入键事件(如在 Windows 中通过 Alt-Numpad 方法来输入 ASCII 序列)。对于不生成 Unicode 字符的键是不会生成键入键事件的(如动作键、修改键等等)。

getKeyChar 方法总是返回有效的 Unicode 字符或 CHAR_UNDEFINED。KEY_TYPED 事件报告字符输入:KEY_PRESSED 和 KEY_RELEASED 事件不必与字符输入关联。因此,可以保证 getKeyChar 方法的结果只对 KEY_TYPED 事件有意义。

对于按下键和释放键事件,getKeyCode 方法返回该事件的 keyCode。对于键入键事件,getKeyCode 方法总是返回 VK_UNDEFINED。

“按下键”和“释放键”事件 是低级别事件,依赖于平台和键盘布局。只要按下或释放键就生成这些事件,它们是发现不生成字符输入的键(如动作键、修改键等等)的惟一方式。通过 getKeyCode 方法可指出按下或释放的键,该方法返回一个虚拟键码。

虚拟键码 用于报告按下了键盘上的哪个键,而不是一次或多次键击组合生成的字符(如 "A" 是由 shift + "a" 生成的)。

例如,按下 Shift 键会生成 keyCode 为 VK_SHIFT 的 KEY_PRESSED 事件,而按下 'a' 键将生成 keyCode 为 VK_A 的 KEY_PRESSED 事件。释放 'a' 键后,会激发 keyCode 为 VK_A 的 KEY_RELEASED 事件。另外,还会生成一个 keyChar 值为 'A' 的 KEY_TYPED 事件。

按下和释放键盘上的键会导致(依次)生成以下键事件:

    KEY_PRESSED
    KEY_TYPED(只在可生成有效 Unicode 字符时产生。)
    KEY_RELEASED
但在某些情况下(例如,在激活自动重复或输入方法时),该顺序可能会有所不同(并且与平台有关)。
注:

不产生 Unicode 字符的键组合(如 F1 和 HELP 键等动作键)不会生成 KEY_TYPED 事件。
并非所有键盘和系统都能够生成所有的虚拟键码。在 Java 中不会尝试人为地生成这些键。
虚拟键码不标识物理键:它们取决于平台和键盘布局。例如,使用美国键盘布局时生成 VK_Q 的键在使用法国键盘布局时将生成 VK_A。
并非所有的字符都有与之关联的 keycode。例如,没有用于问号的 keycode,因为没有在主层上显示问号的键盘。
为了支持平台无关的动作键处理,Java 平台为某些功能使用少量附加虚拟键常量,否则必须通过解释虚拟键码和修饰符来识别这些功能。例如,对于日文 Windows 键盘,返回 VK_ALL_CANDIDATES 而不是 VK_CONVERT 加 ALT 修饰符。
正如 Focus Specification 中指定的那样,默认情况下键事件被指派给焦点拥有者。
警告:除了 Java 语言定义的这些键之外(VK_ENTER、VK_BACK_SPACE 和 VK_TAB),不要依赖 VK_ 常量值。Sun 保留将来根据需要更改这些值的权利,以适应更大范围的键盘。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-9 08:45:19
沙发
本帖最后由 仇邓强 于 2013-10-9 08:50 编辑

坐看楼下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马