下面我们来看一下实现这个事件监听器的一些方法。
那么在实现事件监听器的时候我们可以单独写一个类, 写一个类呢它实现这些接口,或者集成Adapter。
也可以呢在相应的类里面直接实现这些接口,implements,
也可以使用匿名类。也可以呢使用Lambda表达式。其中呢这个匿名类呢使用的是最多的。
我们分别看一下这几个怎么写。先看看这个匿名类。这个匿名类呢就是add一个Actio- nListener,
然后new一个这个Listener。这个Listener呢就是一个匿名类, 那我们只写了这个接口的名字,这个类的名字我没有写。
同时呢有new,同时在实现的时候呢就 创建了这个对象,new了这个对象。注意这个new然后有个圆括号,
这个花括号呢就是一个实现体。所以它是个匿, 匿名的类。在这里面有override这个实现这个方法,
就可以了。那有的时候我们这个匿名类呢更复杂,比如说我们 一个是MouseMotionListener,这个鼠标移动
这个事件,它里面就要实现两个方法, 那我们用new一个Adapter呢,那就可以呢
只override我们关注的这些方法,比如说WindowAdapter,
就可以只关注windowClosing,就是在这个时候呢系统呢就退出。
这里呢就相当于我们直接说当它关闭的时候呢就退出系统。
那匿名类呢有的时候可以更简写,对于那些只有一个方法的,
在JAVA8里头呢它可以用Lambda表达式直接来写,那它的写法就更简单了,
比如说ActionListener,它只有一个actionPerformed, 我们把这个接口的名字给省略了,
把这个方法的名字也给省略了, 直接用一个Lambda表达式就是参数,一个箭头,也就是一个减号
一个大于号,一个花括号,里面写我们要做的事情。
这里呢,我们把这个按钮,用,这个对象用getSource
然后再把它转成JBotton,所以这种写法也是很常见的。
总的说来呢,有多种方法来实现。匿名类呢用的最多,然后呢
有的时候还用Lambda表达式。我们在用的时候呢一个对象可以注册
多个监听器,然后呢,多个对象呢也可以注册到同一个监听器。那么这样的话一个对象注册多- 个监听器
就是说我可以处理键盘事件,可以处理鼠标事件,或者键盘事件,
或者是一个事件呢我们可以同时做多件事情。那么多个对象注册到同一个事件呢,
那我们就可以写同一个类,然后让它呢用getSource来得到
来判断是哪个对象。我们看一个例子,请看这个例子。
那这里呢我们有多个Listener。那一个Listener呢,
一个对象我们可以add多个Listener。比如说这个鼠标,我窗口的
事件。然后,鼠标移动的事件。这个Listener
我们在用类来实现的时候呢可以带些参数,比如说我这里的构造方法里面就把这个
JFrame对象呢给传递进来。然后呢这里面有一系列的方法,
啊,然后我们在这里面还有个Listen2,另一个呢是鼠标的Listener。
我们同样的也有构造方法, 里面也要override一个方法。在这里呢我们有鼠标
移动,啊这个事件,还有鼠标拖动drag这个事件。
在鼠标拖动的时候呢我们用了一个getGraphics得到一个绘图对象,
做line,画线,画了一个很小的线。
这个很小的线呢实际上这里就是画点了。
因为这个线呢就是起点和终点是一样的。在这里我们同时用到了这个事件对象的
XY的位置,也就说,当鼠标 左键按下并且拖动的时候呢它就画一系列的点,
我们运行看看这个效果。好,
这里呢,当然窗口事件,我们关闭窗口,然后鼠标移动,你会发现呢这个移动的时候
我们把移动位置显示出来,当它拖动的时候,鼠标 按下的时候呢它就画一系列的点,所以我们可以看到呢,
就是一个对象可以添加多个事件监听器, 当然多个对象也可以添加到一个事件监听器上面。
同时呢我们调用这个getSource以及呢 对象的其他的一些get方法,能得到相关的信息。
我们在使用事件的时候呢一定要注意一个问题,就是
这个事件,如果是 跟线程相关,那么在线程里面要更新界面的话,
那么要放到呢专门的线程,这个线程呢它有个专用名字叫事件派发线程。
我们或者简称为呢界面线程。就界面里面的事件派发线程。
也就是说当我们线程里面,假如说我们线程去下载一个文档, 下载完了以后然后我们想在界面上显示说
我已经下载完了,这个时候呢,显示已经下载完了这些事情要更新界面,要在
界面上做处理,我们都要调用这个SwingUtilities里面的invokeLa- ter。
这个方法呢实际上就是说 后面去调用,它实际上意思就是我把这样一个任务呢
放到哪儿去呢,放到这个事件派发的线程,也就是界面线程里面去做。
而不能在我当前这个下载这个下载文件这个线程里去做。
啊,我们下面也看一个例子。请看这个例子。这个例子呢,
我们在这里面呢,有一个事件监听器里面呢
它有做某件比如说比较耗时间的操作,我们有new一个thread,
这个thread对象里面去做了一件事情。做了很多事情。
这个事情完了以后呢我们又想在这个线程, 在这个线程里面要更新界面,那怎么办?我们就得用SwingUtilities.inv-
okeLater, 然后在这里面去调用它。这里面注意invokeLater
它调用的也是一个runnable接口, runnable的接口呢实际上里面就是run方法,我们最简单呢就是
用一个lambda表达式来写。所以这就是典型的线程里面
要处理别的事情。线程里面又要调用界面,就用这个方法。
我们甚至呢比较好的习惯就是在main方法里面就是它也是main是另一个线程,
啊,main是一个主线程,然后我们要做一些界面的这个操作。最好也放到
SwingUtilities.invokeLater。比如说new一个对象啊, .setVisible,所以这是一个比较好的一个习惯。