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。
每次我按一下键盘,程序却执行两次,程序如图,求解,谢谢 展开
每次我按一下键盘,程序却执行两次,程序如图,求解,谢谢 展开
4个回答
展开全部
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的详细原因没办法给你仔细分析,不过还是希望能帮到你.
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的详细原因没办法给你仔细分析,不过还是希望能帮到你.
展开全部
造型异常,你把ComponentEvent和InputEvent整错了。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
类转换异常, componentEvent不能转换为InputEvent, 仔细检查下代码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
componentEvent不能转换为InputEvent,这个答案正确,具体原因再看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询