Java 键盘事件

运行时候出现问题:Exceptioninthread"AWT-EventQueue-0"java.lang.ClassCastException:java.awt.eve... 运行时候出现问题:Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.event.ComponentEvent cannot be cast to java.awt.event.InputEvent。
每次我按一下键盘,程序却执行两次,程序如图,求解,谢谢
展开
 我来答
hartx
2011-02-12 · TA获得超过332个赞
知道答主
回答量:199
采纳率:0%
帮助的人:159万
展开全部
1. 因为ComonentEvent是InputEvent的super class, 它的sub class包括
ContainerEvent, FocusEvent, InputEvent, PaintEvent 以及 WindowEvent
所以你的例子里不能使用casting, 反过来才可以.

2. 至于为什么这里的e是ComponentEvent, 从你给的code里边没办法确认. 猜测的话,是你使用了ComponentListener, 如果你的程序只需要考虑接收键盘动作的话,建议改成KeyListener, 当然InputListener也是可以,不过通常implements的时候选用最底层的class比较好一点. 如果你同时需要考虑其它的Event,比如ContainerEvent, 那没有捷径,你需要两个相对应各自sub class的Listener.

3.每次按下键盘程序执行两次, 这个是因为KeyEvent包含以下三种.
KEY_PRESSED, KEY_RELEASED 和 KEY_TYPED
对应三个在Implement KeyEvent时必须的方法
public void keyTyped(KeyEvent e) { }
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) {
而你每一次敲一次键盘, Listener会被触发至少两次,由于key pressed和key released. 如果说这个键不是action key(可以用isActionKey()判断),比如abcd1234一类的可以被显示的,key typed也会触发Listener.
所以说,如果你的程序执行位置选择在每一次Listener被触发时,且没有经过任何判断,那当然就会执行2-3次了 (你的例子中选择的键是左方向键,属于action key所以是2次).

4.如果想要按一次键盘只执行一次的话,有以下几种办法.
a. 自己做一个class, implement KeyListener, 然后把这个Listener添加到component上.然后把你的判断以及要运行的代码放在keyPressed()或者keyReleased()下边. 这种方法可以让程序可读性增加,并且这也是本来设计这三个methods的本意,非常推荐.
b. 比较 e.getID() == KeyEvent.KEY_PRESSED (或者KEY_RELEASE, KEY_TYPED, 根据需要选择). 这种方法虽然简单易行,也比较符合你提供的例子(用一个自己的method去处理所有的AWTEvent) 但是在有时间的情况下比较不推荐,第一种方法才是正选.
c. 检查e.paramString() 里边的内容, 这个字符串开头就是当前Event的名字(KEY_PRESSED, KEY_RELEASED 或者 KEY_TYPED). 但是一般paramString()都是debug用,只是检查Event类型用getID就可以了,非常不推荐用.

由于提供的信息有限,所以产生ClassCastException的详细原因没办法给你仔细分析,不过还是希望能帮到你.
candiesyangyan
2011-02-10 · TA获得超过424个赞
知道答主
回答量:77
采纳率:0%
帮助的人:0
展开全部
造型异常,你把ComponentEvent和InputEvent整错了。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
simple1129
2011-02-11 · 超过24用户采纳过TA的回答
知道答主
回答量:66
采纳率:0%
帮助的人:45.9万
展开全部
类转换异常, componentEvent不能转换为InputEvent, 仔细检查下代码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
劇終BF
2011-02-11
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
componentEvent不能转换为InputEvent,这个答案正确,具体原因再看看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式