详谈Java中的事件监听机制

作者:jingxian 时间:2022-08-05 00:29:30 

鼠标事件监听机制的三个方面:

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 class Draw {

public static void main(String[] args) {
   Draw t = new Draw();
   t.showUI();

}

// 界面初始化方法
 public void showUI() {
   JFrame jf = new JFrame();
   jf.setTitle("画图");
   jf.setSize(700, 700);
   jf.setDefaultCloseOperation(3);
   jf.setLocationRelativeTo(null);
   FlowLayout layout = new FlowLayout(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 = new JButton();
   jb1.setBackground(Color.RED);
   jf.add(jb1);
   jb1.setPreferredSize(new Dimension(30, 30));
   JButton jb2 = new JButton();
   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 class DrawListener implements MouseListener, MouseMotionListener,
   ActionListener {

private int x1, y1, x2, y2;// 记录两次鼠标的点击坐标
 private Graphics g;// 从界面获取画布对象
 private String str;// 记录当前按钮的信息,区分不同的按钮
 private Color color;// 记录画笔的颜色信息
 private int f = 1;// 控制变量,用于更新坐标

public DrawListener(Graphics g) {
   this.g = g;
 }

//鼠标按下时的处理方法
 public void mousePressed(MouseEvent e) {
   // 记录第一次点击的位置;由对象e得到
   if (f == 1) {
     x1 = e.getX();
     y1 = e.getY();
   }
 }

//鼠标点击时的处理方法
 public void mouseClicked(MouseEvent e) {
   if ("三角形".equals(str)) {
     System.out.println("sanjaioxing");
     int x, 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 void mouseReleased(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 void mouseEntered(MouseEvent e) {

}

// 鼠标退出时的处理方法
 public void mouseExited(MouseEvent e) {

}

public void actionPerformed(ActionEvent e) {
   if ("".equals(e.getActionCommand())) {
     JButton jb = (JButton) e.getSource();
     color = jb.getBackground();
   } else {
     str = e.getActionCommand();
   }
 }

// 鼠标拖动时的处理方法
 public void mouseDragged(MouseEvent e) {
   if ("画曲线".equals(str)) {
     int x, y;
     x = e.getX();
     y = e.getY();
     g.setColor(color);
     g.drawLine(x1, y1, x, y);
     x1 = x;
     y1 = y;
   }

}

// 鼠标释放时的移动方法
 public void mouseMoved(MouseEvent e) {

}

}
标签:java,监听机制,事件
0
投稿

猜你喜欢

  • java 多态性详解及常见面试题

    2023-03-15 18:08:49
  • 详解Java内存泄露的示例代码

    2023-06-08 03:34:51
  • IDEA项目maven project没有出现plugins和Dependencies问题

    2021-08-08 10:59:53
  • Java监听器的作用及用法代码示例

    2023-06-24 06:59:07
  • Java使用JDBC实现Oracle用户认证的方法详解

    2022-10-06 08:59:36
  • Flutter使用sqflite处理数据表变更的方法详解

    2023-10-21 11:05:49
  • Java使用Preference类保存上一次记录的方法

    2023-05-08 01:49:14
  • java服务器的简单实现过程记录

    2023-01-18 06:44:34
  • springboot2.0使用Hikari连接池的方法(替换druid)

    2023-04-12 00:54:33
  • 详解基于spring多数据源动态调用及其事务处理

    2023-06-23 14:37:25
  • Java线程池Executor用法详解

    2022-02-13 01:21:16
  • java实现简单单链表

    2023-10-30 09:45:46
  • 学生视角带你了解Java内部类

    2022-09-29 17:51:04
  • 使用C#发送Http请求实现模拟登陆实例

    2023-06-22 22:25:07
  • springboot整合Quartz实现动态配置定时任务的方法

    2023-03-08 22:13:10
  • 浅谈Java中复制数组的方式

    2022-04-14 23:30:27
  • Java 如何优雅的抛出业务异常

    2023-11-24 04:04:34
  • Spring5中的WebClient使用方法详解

    2023-08-05 14:50:24
  • C# 一个WCF简单实例

    2023-07-12 20:53:43
  • 运用示例简单讲解C#取消令牌CancellationTokenSource

    2022-02-04 02:36:14
  • asp之家 软件编程 m.aspxhome.com