Java 键盘事件
发布时间:2025-05-24 08:05:34 发布人:远客网络
一、Java 键盘事件
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的详细原因没办法给你仔细分析,不过还是希望能帮到你.
二、java的getSource()方法
在我这里没有出现任何错误,点击"退出"就可以退出.
因为你使用的事件触发方式是实现ActionListener接口,然后在事件触发方法中,判断事件源来进行功能分类的, getSource是判断这个事件是由哪个组件发出的,如果是btn这个按钮发出的,就退出系统,如果不是btn发出的,就不执行操作,这里之后一个按钮注册了ActionListener,所以效果不明显,如果你再为另外一个按钮注册ActionListener的话(比如加一个最大化的功能按钮),就要用getSource来区分产生事件的按钮,然后来区分执行的功能了.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class frame extends Frame implements ActionListener{
Button btn= new Button("退出"), btn1= new Button("最大化");
btn.setBackground(Color.orange);
btn.setForeground(Color.RED);
add(btn, BorderLayout.CENTER);
add(btn1, BorderLayout.SOUTH);
btn1.addActionListener(this);
public void actionPerformed(ActionEvent e){
} else if(e.getSource()== btn1){
this.setExtendedState(Frame.MAXIMIZED_BOTH);
public static void main(String args[]){
三、RxJava和EventBus的区别
RxJava和EventBus的区别可分为以下几点:
1、RxJava要比EventBus的应用更广泛,EventBus仅仅是作为一种消息的传递工具,但是RxJava里面几乎可以做任何事情。
2、如果是Android开发的话,可以使用RxAndroid,这是对RxJava的一个扩展,结合sqare公司的retrofit可以很轻松的完成网络的访问。
3、在Android中异步操作一般使用AsycTask来完成,但是AsycTask有很多缺点,如不能方便的终止任务的执行等。
4、RxAndroid完全可以替代AsycTask来完成各种异步操作,而且还有BindActivity和BindFragment方法,你根本不需要考虑异步操作时的Activity和Fragment的生命周期问题,还有更加强大的的链式调用,可以使程序很简洁。
两者之间的联系:RxJava和EventBus一样也是基于观察者模式,但是使用的场景确实异步数据流的处理。