在完成远程控制的客户端控制时
需要把客户端在界面上的鼠标事件记录下来
发送给被控端执行
那么这个鼠标监听器到底应该怎么加呢?
我们发现一个界面可以加的鼠标监听器有如下3个
testJFrame.addMouseListener(new MouseListener(){});
testJFrame.addMouseMotionListener(new MouseMotionListener(){});
testJFrame.addMouseWheelListener(new MouseWheelListener(){});
用内部类实现实现每个接口,都必须要重写每个接口中定义的所有抽象方法
但,并不是每个接口中的每个抽象方法所处理的鼠标事件都是我们需要的
比如
testJFrame.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) { }
@Override
public void mouseReleased(MouseEvent e) { }
});
MouseListener中需要重写的抽象方法就多大5个,而其中我们真正需要的却只有mousePressed和mouseReleased
如果把所以抽象方法都复写,无疑是浪费自己的力气和页面
于是很简单的就想到了用MouseAdapter来复写我们需要需要的抽象方法
查看MouseAdapter API发现
public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener
这也是一个实现了3个鼠标监听器的抽象类
于是我们可以通过继承该类来重写所有我们需要的事件处理方法,而不用理会我们用不到的那几种,代码简单,明晰
新建MouseEventLisenter来处理需要处理的所有鼠标事件
public class MouseEventHandle extends MouseAdapter{
Client _client;
public MouseEventHandle(Client client){
_client=client;
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("监听到鼠标按下");
int buttons = e.getButton();
_client.mousePressAct(buttons);
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("监听到鼠标松开");
int buttons = e.getButton();
_client.mouseReleaseAct(buttons);
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int wheelRotation=e.getWheelRotation();
_client.mouseWheelAct(wheelRotation);
}
@Override
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
_client.mouseMoveAct(x, y);
}
}
在界面上只要加上该类的一个实例化对象即可
终于,终于的终于,终于,废话说完了。
下面开始说明我们遇到的问题
在界面上用
//实例化鼠标事件监听器
MouseEventHandle mouseHandle=new MouseEventHandle(_client);
// 给界面加鼠标监听器
serverSreenLabel.addMouseMotionListener(mouseHandle);
然后我们神奇的发现,鼠标move的时候能监听到,但是鼠标press和release时却怎么都监听不到
这怎么回事呢?
也太神奇了吧,折腾了半天,就是没发现问题
恍惚一会
想起,鼠标事件的监听,不还是事件监听器模型吗?
那么事件监听器模型的本质是什么呢?
用个简单的例子来对比说明一下
类A为事件生产者,每当A中的C执行后,我们就认为事件被生产
接口B为事件监听器接口,监听A中的C,也就是说,每当A中的C执行一次后,我们就执行B中对应的方法Handl
e来进行相应的事件处理
那么我们该怎么实现用B来监听A中的C呢?
这就要把B加入监听C的队列cListener中
听起来好像玄乎其玄,有点搞不明白,咱还是看代码吧
public class A {
private java.util.ArrayList<B> cListener=new java.util.ArrayList<B>();//C的监听器队列
/**
* 加监听器的方法
* @param b 监听器对象
*/
public void addCListener(B b){
cListener.add(b);
}
public void c(){ }
public void example(){
//………………
//………………
c();
fireHandle(); //每当监听到C,则执行处理方法
//…………………………
}
/**
* 事件处理
*/
private void fireHandle() {
for(int i=0;i<cListener.size();i++){
cListener.get(i).handle();
}
}
}
再看监听器B的代码
/**
* 事件c的监听器
* @author mzd
*
*/
public interface B {
public void handle() ;//事件处理方法
}
那么这个监听器该怎么用呢?
我们先用类D,实现接口B,在D中的handle()方法中重写我们需要的事件处理方法
然后把D加给A
从此,每当A中的C产生一次,D中的handle()方法就会执行,从而完成对A中C的监听
看代码
D的实现
public class D implements B{
@Override
public void handle() {
System.out.println("监听到A中C");
}
}
监听器的添加
public class Test {
public static void main(String[] args) {
A a=new A();
D d=new D();
a.addCListener(d);
}
}
好了
监听器模型回顾完了
还是回到我们遇到的问题
为什么我们明明用了
//实例化鼠标事件监听器
MouseEventHandle mouseHandle=new MouseEventHandle(_client);
// 给界面加鼠标监听器
serverSreenLabel.addMouseMotionListener(mouseHandle);
鼠标的press和release却没有被监听到呢?
我想,答案已经很明显了吧
因为我们只加了MouseMotionListener,所以,每次对应的MouseEvent执行后,fireMouseEvent方法只是从motionListener队列中调用相应的mouseMoved()方法
而鼠标点击和松开时,因为没有调用addMouseListener(),mouseListener队列为空,当中并没有我们自己实现的MouseEventHandle对象,所以每次执行时,也就自然没有执行到当中相应的mousePressed()和mouseReleased()方法
改正的方法很简单
把我们自己实例化的MouseEventHandle给3个监听器队列都加上就OK了
代码如下
//实例化鼠标事件监听器
MouseEventHandle mouseHandle=new MouseEventHandle(_client);
// 给界面加鼠标移动监听
serverSreenLabel.addMouseMotionListener(mouseHandle);
// 给界面加鼠标点击事件监听器
serverSreenLabel.addMouseListener(mouseHandle);
//给界面加鼠标滚轮文件监听器
serverSreenLabel.addMouseWheelListener(mouseHandle);
分享到:
相关推荐
这个例子将探讨如何在Java中使用监听器,特别是事件监听器,它们是Java Swing和Java AWT库中用于图形用户界面(GUI)交互的核心组成部分。 首先,我们需要了解Java中的事件模型。Java事件模型基于发布/订阅原则,...
2. 事件监听器的实现应该遵循单一职责原则,避免将多个事件处理方法放在同一个事件监听器中。 3. 事件源应该提供注册事件监听器的方法,以便事件监听器可以被正确地注册。 Java监听器是Java编程中的一种重要设计...
### 基于RBAC与监听器机制设计作业管理软件 #### 一、项目背景与目标 本项目旨在设计一款适用于教育场景中的作业管理系统,利用角色基础的访问控制(Role-Based Access Control,简称RBAC)及监听器机制来实现安全...
在监听器模式中,主要包含三个要素:事件源、事件对象和监听器。 事件源是产生事件的对象。在用户界面编程中,事件源通常是用户交互的对象,如按钮、菜单、窗口等;在业务逻辑中,事件源可能是业务对象的某些特定...
3. **内部匿名类监听器**:内部匿名类监听器是一种特殊的内部类监听器,它没有显式的名称,通常是在需要监听器的地方直接定义。 4. **自身监听器**:自身监听器是指一个对象自身实现了监听器接口,并且用来监听自身...
结合这两个概念,监听器模式可以用于实现生产消费模型中的事件通知机制。例如,当生产者将新数据放入队列时,可以触发一个“数据生成”事件,所有注册的监听者(如消费者线程)都会接收到这个通知,然后进行数据的...
Oracle监听器是Oracle数据库系统的重要组成部分,它负责管理和控制数据库实例与客户端应用程序之间的网络通信。在Oracle数据库环境中,监听器是运行在服务器端的一个后台进程,它的主要职责是监听来自客户端的连接...
Java中的事件模型基于观察者模式,即一个对象(事件源)发生特定事件时,会通知注册在其上的其他对象(监听器)。这种设计模式促进了代码的解耦,增强了程序的灵活性。 2. **AWT和Swing监听器**: 在Java GUI编程...
2. 注册监听器:在web.xml配置文件中,我们需要将自定义的监听器类与对应的监听器接口关联,这样服务器在启动时就能识别并加载这些监听器。 3. 事件处理逻辑:在监听器的回调方法(如contextInitialized()、...
例如,一个常见的应用场景是,使用监听器创建会话并在会话创建时设置一个默认值,然后使用过滤器检查该值是否满足条件,如果不符合则重定向到登录页面。这样可以确保只有经过验证的用户才能访问受保护的资源。 总之...
在JavaServer Faces (JSF)框架中,监听器和转换器是两个重要的组件,它们用于增强用户界面与后台数据处理的交互。在这个项目中,我们深入探讨了如何在JSF中有效地利用这两种机制。 首先,我们要理解JSF监听器的作用...
标题提到的“android 外部类作为事件监听器类”是指将一个非匿名类(外部类)作为事件处理的对象,这在某些情况下可能是必要的,比如当监听器需要持有较复杂的成员变量或者实现多个接口时。然而,描述中提到的一个...
例如,当一个用户打开一个Web页面时,创建一个新的会话,监听器会接收到这个事件并增加在线人数;而当用户关闭浏览器或会话超时时,监听器则会减少在线人数。这样,我们就可以实时获取到网站的在线访问者数量。 ...
- **生命周期监听器**:主要包括`ServletRequestListener`、`HttpSessionListener`、`ServletContextListener`,用于监听`request`、`session`、`servletContext`这三个容器对象的创建与销毁。 - **属性监听器**:...
事件监听器的实现方式有多种,本篇文章将介绍四种常见的事件监听器实现方式:自身类作为事件监听器、外部类作为事件监听器、匿名内部类作为事件监听器和内部类作为事件监听器。 1. 自身类作为事件监听器 在这个...
* 监听客户端请求:监听器运行在数据库服务器之上,与 Oracle 实例相关关联,是一个专门的进程 process,在 Windows 的服务项目或者 Linux 的运行进程列表中,都会看到对应的运行进程。 * 为客户端请求分配 server ...
本文将深入探讨如何在Oracle单一主机上配置多个实例与多个监听器,并详细解释相关知识点。 ### Oracle单一主机多个实例多个监听器配置 #### 1. 理解Oracle实例与监听器 在Oracle中,每个实例由一个后台进程组和...
在“小程序 学习用的 监听器”这个小实验中,你可能涉及到创建和配置监听器的过程。这通常包括以下几个步骤: 1. **创建监听器类**:首先,你需要定义一个类并实现相应的监听器接口,例如ServletContextListener。 ...
人拥有吃的方法public void eat(){},我们的目的是,在这个人吃之前要提醒他洗手,所以我们要监听这个人,不管他在什么时候吃,我们都要能够监听到并且提醒他洗手,通俗点讲这个是监听器的作用(在吃之前提醒他...
TableColumnModelEvent 是一种通知监听器某一个表的列模型已经发生更改的事件,例如添加、移除或移动列。TableColumnModelListener 是对应的监听器接口,它提供了五个方法:columnAdded、columnMargined、...