Java Swing开发事件处理

1 Java事件处理机制

在Java事件处理体系结构中,主要涉及的对象
● 事件(Event)
● 事件源(Event Source)
● 事件监听器(Event Listener)

基于监听器的事件处理机制是一种委派式的事件处理方式,实现步骤:
①委托: 组件将事件处理委托给特定的事件处理对象
②通知:触发指定的事件时,就通知所委托的事件处理对象
③处理:事件处理对象调用相应的事件处理方法来处理该事件

在这里插入图片描述

2 事件类

●事件用于封装事件处理所必须的基本信息
●所有AWT的事件类都是AWTEvent类的子类
●AWTEvent是所有AWT事件的根事件类

AWTEvent常用方法如下:
在这里插入图片描述
AWT事件可分为低级事件和高级事件
在这里插入图片描述

3 监听接口

监听接口中定义了抽象的事件处理方法,常用的监听接口如下
在这里插入图片描述
在这里插入图片描述

4 事件处理步骤

1、创建监听类

    // 1. 创建扩展ActionListener的监听类
    class ButtonListener implements ActionListener {
    }

2、创建监听对象

    class ButtonListener implements ActionListener {
        //重写ctionListener接口中的事件处理方法actionPerformed()
        public void actionPerformed(ActionEvent e) {

        }
    }

3、注册监听对象

//2  创建一个监听对象
ButtonListener btnListener = new ButtonListener();
//3 注册监听
btnRed.addActionListener(btnListener);
btnGreen.addActionListener(btnListener);
btnYellow.addActionListener(btnListener);

事件处理案例

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ChangeColor extends JFrame {
    JPanel p;
    JButton btnRed, btnGreen, btnYellow;

    public ChangeColor() {
        super("事件测试,改变颜色");
        //创建组件
        p = new JPanel();
        btnRed = new JButton("红色");
        btnGreen = new JButton("绿色");
        btnYellow = new JButton("黄色");

        //2  创建一个监听对象
        ButtonListener btnListener = new ButtonListener();
        //3 注册监听
        btnRed.addActionListener(btnListener);
        btnGreen.addActionListener(btnListener);
        btnYellow.addActionListener(btnListener);

        //将按钮添加到面板
        p.add(btnRed);
        p.add(btnGreen);
        p.add(btnYellow);
        //将面板添加到窗体
        this.add(p);
        //设置窗口大小
        this.setSize(300, 300);
        //设置窗口左上角坐标
        this.setLocation(200, 100);
        //设置窗口关闭方式
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口可见
        this.setVisible(true);
    }

    // 1. 创建扩展ActionListener的监听类
    class ButtonListener implements ActionListener {
        //重写ctionListener接口中的事件处理方法actionPerformed()
        public void actionPerformed(ActionEvent e) {
            //获取事件源
            Object source = e.getSource();
            //判断事件源,进行相应的处理
            if (source == btnRed) {
                //设置背景面板的颜色为红色
                p.setBackground(Color.red);
            } else if (source == btnGreen) {
                //设置背景面板的颜色为绿色
                p.setBackground(Color.green);
            } else {
                //设置背景面板的颜色为黄色
                p.setBackground(Color.yellow);
            }
        }
    }

    public static void main(String[] args) {
        new ChangeColor();
    }
}

在这里插入图片描述

事件处理案例代码优化:通过匿名监听类的方式注册监听

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ChangeColorAnonymous extends JFrame {
    JPanel p;
    JButton btnRed, btnGreen, btnYellow;

    public ChangeColorAnonymous() {
        super("事件测试,改变颜色");
        //创建组件3
        p = new JPanel();
        btnRed = new JButton("红色");
        btnGreen = new JButton("绿色");
        btnYellow = new JButton("黄色");

        //通过匿名监听类的方式注册监听
        btnGreen.addActionListener(new ActionListener() {
            //重写ActionListener接口中的事件处理方法actionPerformed()
            @Override
            public void actionPerformed(ActionEvent e) {
                //设置面板颜色为绿色
                p.setBackground(Color.green);
            }
        });
        btnRed.addActionListener(new ActionListener() {
            //重写ActionListener接口中的事件处理方法actionPerformed()
            @Override
            public void actionPerformed(ActionEvent e) {
                //设置面板颜色为红色
                p.setBackground(Color.red);
            }
        });
        btnYellow.addActionListener(new ActionListener() {
            //重写ActionListener接口中的事件处理方法actionPerformed()
            @Override
            public void actionPerformed(ActionEvent e) {
                //设置面板颜色为黄色
                p.setBackground(Color.yellow);
            }
        });

        //将按钮添加到面板
        p.add(btnRed);
        p.add(btnGreen);
        p.add(btnYellow);
        //将面板添加到窗体
        this.add(p);
        //设置窗口大小
        this.setSize(300, 300);
        //设置窗口左上角坐标
        this.setLocation(200, 100);
        //设置窗口关闭方式
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口可见
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new ChangeColorAnonymous();
    }
}

5 键盘事件

KeyEvent类是键盘事件类,该类对每个键盘按键都定义了一个整型常量与之对应

KeyEvent.VK UP代表“↑”键
KeyEvent.VK_ DOWN代表"↓"KeyEvent.VK_ RIGHT代表方向键"→"KeyEvent.VK_ LEFT代表"←”键

KeyEvent类还提供 了以下两个常用的方法:

int getKeyCode():获取键盘按键的码值
char getKeyChar():获取键盘按键上的字符值

键盘事件案例

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyEventDemo extends JFrame {
    private JPanel p;
    private JButton btnMove;

    public KeyEventDemo() {
        super("鼠标事件");
        //创建组件
        p = new JPanel();
        btnMove = new JButton("走动");

        //通过匿名监听类的方式注册监听
        btnMove.addKeyListener(new KeyListener() {
            //敲击键盘事件的处理方法
            @Override
            public void keyTyped(KeyEvent e) {
            }

            //按下键盘事件的处理方法
            @Override
            public void keyPressed(KeyEvent e) {
                //获取按下键盘的码值
                int key = e.getKeyCode();
                //获取按钮当前x,y的坐标
                int x = btnMove.getX();
                int y = btnMove.getY();
                if (key == KeyEvent.VK_RIGHT) {
                    //向右,x坐标增加
                    btnMove.setLocation(x + 5, y);
                } else if (key == KeyEvent.VK_LEFT) {
                    //向左,x坐标减少
                    btnMove.setLocation(x - 5, y);
                } else if (key == KeyEvent.VK_UP) {
                    //向上,y坐标增加
                    btnMove.setLocation(x, y + 5);
                } else if (key == KeyEvent.VK_DOWN) {
                    //向下,y坐标减少
                    btnMove.setLocation(x, y - 5);
                }
            }

            //松开键盘事件的处理方法
            @Override
            public void keyReleased(KeyEvent e) {
            }
        });

        //将组件添加至面板
        p.add(btnMove);
        //将面板添加到窗体
        this.add(p);
        //设置窗口大小
        this.setSize(300, 300);
        //设置窗口左上角坐标
        this.setLocation(200, 100);
        //设置窗口关闭方式
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口可见
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new KeyEventDemo();
    }
}

在这里插入图片描述

6 鼠标事件

在这里插入图片描述

鼠标事件案例

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MouseEventDemo extends JFrame {
    private JPanel p;
    // 鼠标上一次的坐标
    int pre_x = -1, pre_y = -1;
    // 鼠标当前坐标
    int x, y;

    public MouseEventDemo() {
        super("画板");
        p = new JPanel();
        // 注册鼠标监听
        p.addMouseMotionListener(new PaintListener());
        p.addMouseListener(new ResetListenter());

        // 将面板添加到窗体中
        this.add(p);
        // 设定窗口大小
        this.setSize(400, 300);
        // 设定窗口左上角坐标
        this.setLocation(200, 100);
        // 设定窗口默认关闭方式为退出应用程序
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 设置窗口可视(显示)
        this.setVisible(true);
    }

    // 重写JFrame的paint()方法,此方法用于在窗体中画图
    public void paint(Graphics g) {
        // 设置画笔的颜色
        g.setColor(Color.red);
        // 历史坐标>0
        if (pre_x > 0 && pre_y > 0) {
            // 绘制一条线段,从上一次鼠标拖动事件点到本次鼠标拖动事件点
            g.drawLine(pre_x, pre_y, x, y);
        }
        // 保存当前鼠标坐标,称为上一次的历史坐标
        pre_x = x;
        pre_y = y;
    }

    // 定义鼠标拖动监听类
    class PaintListener implements MouseMotionListener {
        // 鼠标移动的处理方法
        public void mouseMoved(MouseEvent e) {
        }

        // 鼠标拖动的处理方法,负责画画工作
        public void mouseDragged(MouseEvent e) {
            // 获取鼠标当前的坐标
            x = e.getX();
            y = e.getY();
            // 重画,repaint()触发paint()
            MouseEventDemo.this.repaint();
        }
    }

    // 定义鼠标监听类
    class ResetListenter implements MouseListener {

        // 鼠标点击事件处理
        public void mouseClicked(MouseEvent e) {
        }

        // 鼠标按下事件处理
        public void mousePressed(MouseEvent e) {
            // 获取鼠标按键,判断是否是右键
            if (e.getButton() == MouseEvent.BUTTON3) {
                // 重画面板(擦除原来的轨迹)
                MouseEventDemo.this.p.repaint();
            }
        }

        // 鼠标松开事件处理,重置历史坐标
        public void mouseReleased(MouseEvent e) {
            // 鼠标松开时,将历史坐标重设为-1(重置)
            pre_x = -1;
            pre_y = -1;
        }

        // 鼠标进入事件处理
        public void mouseEntered(MouseEvent e) {

        }

        // 鼠标退出事件处理
        public void mouseExited(MouseEvent e) {

        }
    }

    public static void main(String[] args) {
        new MouseEventDemo();
    }
}

在这里插入图片描述

7 适配器

适配器类用于简化事件处理的代码
在这里插入图片描述

适配器案例

使用适配器简化鼠标事件案例中画图功能的MouseEventDemo程序

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MouseEventAdapterDemo extends JFrame {
	private JPanel p;
	// 鼠标上一次的坐标
	int pre_x = -1, pre_y = -1;
	// 鼠标当前坐标
	int x, y;

	public MouseEventAdapterDemo() {
		super("画板");
		p = new JPanel();
		// 注册鼠标监听
		p.addMouseMotionListener(new PaintListener());
		p.addMouseListener(new ResetListenter());

		// 将面板添加到窗体中
		this.add(p);

		// 设定窗口大小
		this.setSize(400, 300);
		// 设定窗口左上角坐标
		this.setLocation(200, 100);
		// 设定窗口默认关闭方式为退出应用程序
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 设置窗口可视(显示)
		this.setVisible(true);
	}

	// 重写JFrame的paint()方法,此方法用于在窗体中画图
	public void paint(Graphics g) {
		// 设置画笔的颜色
		g.setColor(Color.red);
		// 历史坐标>0
		if (pre_x > 0 && pre_y > 0) {
			// 绘制一条线段,从上一次鼠标拖动事件点到本次鼠标拖动事件点
			g.drawLine(pre_x, pre_y, x, y);
		}
		// 保存当前鼠标坐标,称为上一次的历史坐标
		pre_x = x;
		pre_y = y;
	}

	// 定义鼠标拖动监听类
	class PaintListener extends MouseMotionAdapter{
		// 鼠标拖动的处理方法,负责画画工作
		public void mouseDragged(MouseEvent e) {
			// 获取鼠标当前的坐标
			x = e.getX();
			y = e.getY();
			// 重画,repaint()触发paint()
			MouseEventAdapterDemo.this.repaint();
		}
	}

	// 定义鼠标监听类
	class ResetListenter extends MouseAdapter {
		// 鼠标按下事件处理
		public void mousePressed(MouseEvent e) {
			// 获取鼠标按键,判断是否是右键
			if (e.getButton() == MouseEvent.BUTTON3) {
				// 重画面板(擦除原来的轨迹)
				MouseEventAdapterDemo.this.p.repaint();
			}
		}

		// 鼠标松开事件处理,重置历史坐标
		public void mouseReleased(MouseEvent e) {
			// 鼠标松开时,将历史坐标重设为-1(重置)
			pre_x = -1;
			pre_y = -1;
		}
	}

	public static void main(String[] args) {
		new MouseEventAdapterDemo();
	}
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FEI..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值