java中事件监听_Java中的事件监听机制
鼠标事件监听机制的三个方面:
1.事件源对象:
事件源对象就是能够产生动作的对象。在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象。Java中根据事件的动作来区分不同的事件源对象,动作发生在哪个组件上,那么该组件就是事件源对象
2.事件监听方法:
addMouseListener(MouseListener ml) ;该方法主要用来捕获鼠标的释放,按下,点击,进入和离开的动作;捕获到相应的动作后,交由事件处理类(实现MouseListener接口)进行处理。
addActionListener(ActionListener al);捕获类似按钮组件上的鼠标点击动作或者是类似输入框组件上的键盘回车动作;然后将动作以及相关信息交由事件处理类(实现ActionListener接口)的相应方法进行处理。
addMouseMotionListener(MouseMotionListener mml);捕获鼠标的移动和拖动动作;然后将动作以及相关信息交由事件处理类(实现MouseMotionListener 接口)的相应方法进行处理。
addKeyListener(KeyListener kl);捕获事件源对象上的键盘按键的按下、释放和敲击动作;然后将动作以及相关信息交由事件处理类(实现KeyListener 接口)的相应方法进行处理。
3.事件接口(事件处理类,也即实现了事件接口的类):
MouseListener 鼠标事件接口,有按下,释放,点击,进入和离开的事件处理方法
ActionListener 动作事件接口,有动作对应的事件处理方法
MouseMotionListener 鼠标移动事件接口,有移动和拖动的事件处理方法
KeyLisetener 键盘事件接口,有释放,按下和敲击的事件处理方法
了解了事件监听的这三个方面之后,我们要对组件添加事件的监听就很容易了。下面是一个小例子:
目标:创建一个简易的绘图板,可以实现按下相应的功能来达到不同的绘画目的。
分析: 1.首选需要一个画图板的简易界面,定义一个Draw类使用Java的Swing组件进行界面的初始化。
2.然后定义事件接口DrawListener类,让它实现以上的接口,重写接口中的方法,达到自己的目的。
3.在Draw中实例化DrawListener类的对象。
4.为Draw类中的组件添加事件监听方法,指定事件处理类为DrawListener。
代码实现:
Draw类
package com.cbs;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;/**
* Draw类,用于界面的初始化
*
* @author CBS
**/
public classDraw {public static voidmain(String[] args) {
Draw t= newDraw();
t.showUI();
}//界面初始化方法
public voidshowUI() {
JFrame jf= newJFrame();
jf.setTitle("画图");
jf.setSize(700, 700);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
FlowLayout layout= newFlowLayout(FlowLayout.LEFT);
jf.setLayout(layout);
JButton drawLine= new JButton("画直线");
jf.add(drawLine);
JButton drawOval= new JButton("画椭圆");
jf.add(drawOval);
JButton drawArc= new JButton("画曲线");
jf.add(drawArc);
JButton drawPolygon= new JButton("三角形");
jf.add(drawPolygon);
JButton jb1= newJButton();
jb1.setBackground(Color.RED);
jf.add(jb1);
jb1.setPreferredSize(new Dimension(30, 30));
JButton jb2= newJButton();
jb2.setBackground(Color.GREEN);
jf.add(jb2);
jb2.setPreferredSize(new Dimension(30, 30));
jf.setVisible(true);
Graphics g= jf.getGraphics();//获取当前的画笔
DrawListener dl = new DrawListener(g);//实例化DrawListener类的对象
jf.addMouseListener(dl);//为窗体添加鼠标事件监听方法
jf.addMouseMotionListener(dl);//为窗体添加鼠标移动事件监听方法//为按钮添加动作监听
drawLine.addActionListener(dl);
drawOval.addActionListener(dl);
jb1.addActionListener(dl);
jb2.addActionListener(dl);
drawArc.addActionListener(dl);
drawPolygon.addActionListener(dl);
}
}
DrawListener类
package com.cbs;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;/**
* 事件处理类
*
* @author CBS
**/
public classDrawListener implements MouseListener, MouseMotionListener,
ActionListener {private int x1, y1, x2, y2;//记录两次鼠标的点击坐标
private Graphics g;//从界面获取画布对象
private String str;//记录当前按钮的信息,区分不同的按钮
private Color color;//记录画笔的颜色信息
private int f = 1;//控制变量,用于更新坐标
publicDrawListener(Graphics g) {this.g =g;
}//鼠标按下时的处理方法
public voidmousePressed(MouseEvent e) {//记录第一次点击的位置;由对象e得到
if (f == 1) {
x1=e.getX();
y1=e.getY();
}
}//鼠标点击时的处理方法
public voidmouseClicked(MouseEvent e) {if ("三角形".equals(str)) {
System.out.println("sanjaioxing");intx, y;
x=e.getX();
y=e.getY();
g.setColor(color);
g.drawLine(x, y, x1, y1);
g.drawLine(x2, y2, x, y);
f= 1;
}
}//鼠标释放时的处理方法
public voidmouseReleased(MouseEvent e) {//记录鼠标释放时的坐标
if (f == 1) {
x2=e.getX();
y2=e.getY();
}//两个坐标的得到了,可以用于直线的绘制,调用画布对象g方法,在界面上面画出直线
if ("画直线".equals(str)) {
g.setColor(color);
g.drawLine(x1, y1, x2, y2);
}if ("画椭圆".equals(str)) {
g.setColor(color);
g.drawOval(x1, y1, x2, y2);
}if ("三角形".equals(str) && f == 1) {
g.setColor(color);
g.drawLine(x1, y1, x2, y2);
f++;
}
}//鼠标进入时的处理方法
public voidmouseEntered(MouseEvent e) {
}//鼠标退出时的处理方法
public voidmouseExited(MouseEvent e) {
}public voidactionPerformed(ActionEvent e) {if ("".equals(e.getActionCommand())) {
JButton jb=(JButton) e.getSource();
color=jb.getBackground();
}else{
str=e.getActionCommand();
}
}//鼠标拖动时的处理方法
public voidmouseDragged(MouseEvent e) {if ("画曲线".equals(str)) {intx, y;
x=e.getX();
y=e.getY();
g.setColor(color);
g.drawLine(x1, y1, x, y);
x1=x;
y1=y;
}
}//鼠标释放时的移动方法
public voidmouseMoved(MouseEvent e) {
}
}
ps:纯属一孔之见,欢迎指正。
java中事件监听_Java中的事件监听机制相关推荐
- java 多个监听_java中监听一个客户端怎么做?监听多个怎么做?
随着时代的不断进步与发展,人们对于科学技术的使用也越来越普遍化.人们都开始自己学习编程语言以更好的适应时代的发展.今天就来为大家介绍一下,java中监听一个客户端怎么做?监听多个怎么做?一起来看看吧. ...
- java焦点事件如何使用_Java中如何释放鼠标事件的焦?
1.使用MouseListener接口处理鼠标事件 鼠标事件有5种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出 mousePressed(MouseEvent e) 鼠标按下时调用 mou ...
- Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O
I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CP ...
- java类怎么删除对象_java中对象的生成使用和删除
请教大神,在java里,对象生成后,如何删除对象呢?请教大神,在java里,对象生成后,如何删除对象呢? 对象状态由JVM自动管理,GC线程自动回收无用对象,无需也不能自己删除对象. 请问在JAVA中 ...
- java中组件与容器_java中的容器组件和非容器组件
1.java使用到的图形类主要在java.awt 与javax.swing包中. 2.java.awt 与 javax.swing包的区别: ① java.awt中使用的图形类都是依赖于系统的图形库的 ...
- java boolean几个字节_Java中boolean类型到底占用多少个字节?
1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...
- java 基本类型的引用_Java中的基本数据类型与引用数据类型
一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中.栈区:存 ...
- java对于数组的定义_Java中方法的定义与使用,以及对数组的初步了解。
方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...
- java string 后几位_java中String占几个位元组
java中String占几个位元组以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中String占几个位元组 J ...
- java有没有回调函数_Java中的回调函数 - wangjianme的个人空间 - OSCHINA - 中文开源技术交流社区...
Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充. 它的最主要特点是即定义了调用的规范同时又非常的灵活. 回调函数有些类似于观察者模式,它们的区别在于:观察者模式返回的参数为Event ...
最新文章
- 云主机和物理机PK图
- access两字段同时升序排序_7 天时间,我整理并实现了这 9 种常见的排序算法
- python基础题-python基础练习题(一)
- my.ini修改后服务无法启动_VisualSVN Server 自助修改密码页面
- 随机信号的傅里叶分析
- Android游戏开发Android软件开发【教程三十篇】
- python查找第k大的数_Python实现查找二叉搜索树第k大的节点功能示例
- 前天我看见了一只兔子,昨天是一头小鹿,而今天则是你
- 如何开发Linux内核?
- kube-proxy 部署
- ubuntu16.04安装caffe
- 在线PS照片处理工具 无需下载怎么编辑图片
- 新增网站组网方案与解释说明 模版
- 放大电路①---共射极放大电路
- 无意听到的歌, 心理很难受..
- Java Heap - Percolate Up, Percolate Down, and Heapify
- [ Laravel 5.5 文档 ] 快速入门 —— 使用 Laragon 在 Windows 中搭建 Laravel 开发环境
- 阿里云服务器最低多少钱一个月,租阿里云服务器一年多少钱
- Dremel的学习与理解
- python国际象棋ai程序_用 Python 编写一个国际象棋 AI 程序
热门文章
- 1000行 MySQL 学习笔记,不怕你不会,就怕你不学!
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
- Vue多个单文件组件使用
- 这25张图,彻底看懂25个复杂的数学公式!
- 笔记 | 深入理解Transformer
- Python中的数据结构
- 多摄像头实时目标跟踪和计数,使用YOLOv4,Deep SORT和Flask
- 一份火爆国外的PyCharm快捷键和Python代码速查表
- 图像配准的前世今生:从人工设计特征到深度学习
- 在有序数字中寻找和为k的两个数 O(n)