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。
每次我按一下键盘,程序却执行两次,程序如图,求解,谢谢 展开
每次我按一下键盘,程序却执行两次,程序如图,求解,谢谢 展开
展开全部
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,这个答案正确,具体原因再看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询