Java深入学习图形用户界面GUI之事件处理
作者:遇安.112 发布时间:2023-11-29 14:14:57
Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的鼠标单击、按下键盘等操作。在Swing事件处理的过程中,主要涉及三类对象:
1、事件源:事件发生的场所,通常是产生事件的组件,如窗口、按钮、菜单等。
2、事件对象:封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。
3、 * :负责监听事件源上发生的事件,并对各种事件做出相应处理( * 对象中包含事件处理器)。
实现Swing事件处理的主要步骤如下:
1、创建事件源:除了一些常见的按钮、键盘等组件可以作为事件源外,还可以使用JFrame窗口在内的顶级容器作为事件源。
2、自定义事件 * :根据要监听的事件源创建指定类型的 * 进行事件处理。 * 是一个特殊的java类,必须实现XxxListener接口。根据组件触发的动作进行区分,例如,WindowListener用于监听窗口事件,ActionListener用于监听动作事件。
3、为事件源注册 * :使用addXxxListener()方法为指定事件源添加特定类型的 * 。当事件源上发生监听事件后,就会触发绑定的事件 * ,由 * 中的方法对事件进行相应处理。
Swing常用事件处理有:窗体事件、鼠标事件、键盘事件、动作事件等。本文主要针对鼠标事件实现一个登录、退出的窗体操作。
鼠标事件:
在图形用户界面中,用户会经常使用鼠标进行选择、切换界面等操作,这些操作被定义为鼠标事件,包括鼠标按下、鼠标松开、鼠标单击等。java提供了一个MouseEvent类描述鼠标事件。处理鼠标事件时,首先需要通过实现MouseListener接口定义 * (也可以通过继承适配器MouseAdapter类定义 * ),然后调用addMouseListener()方法将 * 绑定到事件源对象。
鼠标事件案例一:通过实现MouseListener接口定义 * 来实现登录、退出操作
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class GUI_3事件处理 {
public static void main(String[] args) {
guitext1 gt=new guitext1();
}
}
//创建一个鼠标监听类实现监听接口
class guitext1 implements MouseListener {
JFrame jf;
JPanel jp;
JLabel l1,l2;
JTextField f1,f2;
JButton jb1,jb2;
public guitext1() {
jf = new JFrame("登录窗口");
jf.setBounds(300, 200, 350, 300);
jp = new JPanel();
Font font = new Font("仿宋", Font.BOLD, 20);
l1 = new JLabel("用户名:");
l1.setFont(font);
f1 = new JTextField("请输入用户名!",20);
f1.setFont(font);
l2 = new JLabel("密 码:");
l2.setFont(font);
f2 = new JTextField("请输入密码!",20);
f2.setFont(font);
jb1 = new JButton("登录");
jb1.setFont(font);
jb1.addMouseListener(this);//登录按钮注册 *
jb2 = new JButton("退出");
jb2.setFont(font);
jb2.addMouseListener(this);//退出按钮注册 *
jp.add(l1);
jp.add(f1);
jp.add(l2);
jp.add(f2);
jp.add(jb1);
jp.add(jb2);
jf.add(jp);
jf.setVisible(true);
}
//这些方法可以不写,但是必须要创建
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
//鼠标点击事件
//mouseClicked==>在组件上单击(按下并释放)鼠标按钮时调用。
@Override
public void mouseClicked(MouseEvent e) {
//getSource()==>得到事件源
if(e.getSource().equals(jb1)) {
if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
//showMessageDialog==>提供一个名为“消息”的信息消息对话框。
JOptionPane.showMessageDialog(null, "登录成功!");
}else{
JOptionPane.showMessageDialog(null, "登录失败,请重新输入!");
//将文本清空
f1.setText(null);
f2.setText(null);
}
}//getSource()==>得到事件源
if(e.getSource().equals(jb2)) {
JOptionPane.showMessageDialog(null, "退出成功!");
//关闭当前窗口
//jf.dispose();
//系统退出
System.exit(0);
}
}
}
案例二:通过继承适配器MouseAdapter类定义 * 来实现登录、退出操作
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class GUI_3事件处理2 {
public static void main(String[] args) {
guitext2 gt=new guitext2();
}
}
class guitext2{
JFrame jf;
JPanel jp;
JLabel l1,l2;
JTextField f1,f2;
JButton jb1,jb2;
public guitext2() {
jf = new JFrame("登录窗口");
jf.setBounds(300, 200, 350, 300);
jp = new JPanel();
Font font = new Font("仿宋", Font.BOLD, 20);
l1 = new JLabel("用户名:");
l1.setFont(font);
//输入用户名,JTextField==>允许编辑单行文本,显示原始字符
f1 = new JTextField(null,20);
f1.setFont(font);
l2 = new JLabel("密 码:");
l2.setFont(font);
//f2 = new JTextField("请输入密码!",20);
//JPasswordField是一个轻量级组件,允许编辑单行文本,其中视图指示输入的内容,但不显示原始字符。
f2=new JPasswordField(null,20);
f2.setFont(font);
jb1 = new JButton("登录");
jb1.setFont(font);
//为按钮添加(注册)自定义鼠标监听事件 * ,并将f1,f2传入
guitext2_1 gt=new guitext2_1(f1,f2);
jb1.addMouseListener(gt);
jb2 = new JButton("退出");
jb2.setFont(font);
jb2.addMouseListener(gt);
// jb2.addMouseListener(new guitext2_1());//另一种写法
jp.add(l1);
jp.add(f1);
jp.add(l2);
jp.add(f2);
jp.add(jb1);
jp.add(jb2);
jf.add(jp);
jf.setVisible(true);
}
}
//自定义一个鼠标监听类
//MouseAdapter==>用于接收鼠标事件的抽象适配器类
class guitext2_1 extends MouseAdapter {
//将f1,f2传入
JTextField f1,f2;
public guitext2_1(JTextField f1, JTextField f2) {
this.f1 = f1;
this.f2 = f2;
}
//mouseClicked==>在组件上单击(按下并释放)鼠标按钮时调用。
public void mouseClicked(MouseEvent e) {
//getSource()==>得到事件源
JButton jButton=(JButton)e.getSource();
if(jButton.getText().equals("登录")){
if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
JOptionPane.showMessageDialog(null, "登录成功!");
}else{
//showMessageDialog==>提供一个名为“消息”的信息消息对话框。
JOptionPane.showMessageDialog(null, "登录失败!");
//将文本清空
f1.setText(null);
f2.setText(null);
}
}
if(jButton.getText().equals("退出")){
JOptionPane.showMessageDialog(null, "退出成功!");
//系统退出
System.exit(0);
}
}
}
案例三:内部类
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class GUI_3事件处理2 {
public static void main(String[] args) {
guitext2 gt=new guitext2();
}
}
class guitext2{
JFrame jf;
JPanel jp;
JLabel l1,l2;
JTextField f1,f2;
JButton jb1,jb2;
public guitext2() {
jf = new JFrame("登录窗口");
jf.setBounds(300, 200, 350, 300);
jp = new JPanel();
Font font = new Font("仿宋", Font.BOLD, 20);
l1 = new JLabel("用户名:");
l1.setFont(font);
//输入用户名,JTextField==>允许编辑单行文本,显示原始字符
f1 = new JTextField(null,20);
f1.setFont(font);
l2 = new JLabel("密 码:");
l2.setFont(font);
//f2 = new JTextField("请输入密码!",20);
//JPasswordField是一个轻量级组件,允许编辑单行文本,其中视图指示输入的内容,但不显示原始字符。
f2=new JPasswordField(null,20);
f2.setFont(font);
jb1 = new JButton("登录");
jb1.setFont(font);
//为按钮添加(注册)自定义鼠标监听事件 *
guitext2_1 gt=new guitext2_1();
jb1.addMouseListener(gt);
jb2 = new JButton("退出");
jb2.setFont(font);
jb2.addMouseListener(gt);
jb2.addMouseListener(new guitext2_1());//另一种写法
jp.add(l1);
jp.add(f1);
jp.add(l2);
jp.add(f2);
jp.add(jb1);
jp.add(jb2);
jf.add(jp);
jf.setVisible(true);
}
//内部类
//MouseAdapter==>用于接收鼠标事件的抽象适配器类
class guitext2_1 extends MouseAdapter {
//mouseClicked==>在组件上单击(按下并释放)鼠标按钮时调用。
public void mouseClicked(MouseEvent e) {
//getSource()==>得到事件源
JButton jButton=(JButton)e.getSource();
if(jButton.getText().equals("登录")){
if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
JOptionPane.showMessageDialog(null, "登录成功!");
}else{
//showMessageDialog==>提供一个名为“消息”的信息消息对话框。
JOptionPane.showMessageDialog(null, "登录失败!");
//将文本清空
f1.setText(null);
f2.setText(null);
}
}
if(jButton.getText().equals("退出")){
JOptionPane.showMessageDialog(null, "退出成功!");
//系统退出
System.exit(0);
}
}
}
}
案例四:匿名内部类
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class GUI_3事件处理3 {
public static void main(String[] args) {
guitext3 gt=new guitext3();
}
}
class guitext3{
JFrame jf;
JPanel jp;
JLabel l1,l2;
JTextField f1,f2;
JButton jb1,jb2;
public guitext3() {
jf = new JFrame("登录窗口");
jf.setBounds(300, 200, 350, 300);
jp = new JPanel();
Font font = new Font("仿宋", Font.BOLD, 20);
l1 = new JLabel("用户名:");
l1.setFont(font);
//输入用户名,JTextField==>允许编辑单行文本,显示原始字符
f1 = new JTextField(null,20);
f1.setFont(font);
l2 = new JLabel("密 码:");
l2.setFont(font);
//f2 = new JTextField("请输入密码!",20);
//JPasswordField是一个轻量级组件,允许编辑单行文本,其中视图指示输入的内容,但不显示原始字符。
f2=new JPasswordField(null,20);
f2.setFont(font);
jb1 = new JButton("登录");
//匿名内部类
jb1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
JOptionPane.showMessageDialog(null, "登录成功!");
}else{
//showMessageDialog==>提供一个名为“消息”的信息消息对话框。
JOptionPane.showMessageDialog(null, "登录失败!");
//将文本清空
f1.setText(null);
f2.setText(null);
}
}
});
jb1.setFont(font);
jb2 = new JButton("退出");
//匿名内部类
jb2.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, "退出成功!");
//系统退出
System.exit(0);
}
});
jb2.setFont(font);
jp.add(l1);
jp.add(f1);
jp.add(l2);
jp.add(f2);
jp.add(jb1);
jp.add(jb2);
jf.add(jp);
jf.setVisible(true);
}
}
其实这些是由复杂的代码逐渐简化的过程。
我突然发现其中的JPanel还没有给大家解读过,所以在这里插入一下这个小知识:
JPanel面板组件是一个无边框且不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。也可以使用JPanel带参数的构造函数JPanel(LayoutManager layout)或者setLayout()成员方法设置JPanel布局管理器。JPanel也被称为中间容器。
来源:https://blog.csdn.net/qq_62731133/article/details/124544921


猜你喜欢
- 前言我们在上一篇文章教大家使用ImageView+TextView的组合自定义控件...可能在开发中你还需要其他功能,例如:按下效果,可以在
- EasyPoi 多sheet导出序言:之前一直想开始写博客,都没有时间行动起来,今天终于开始了我的第一篇博客…最近接到一个导出excel功能
- 在许多游戏中当我们因为一些问题无法接着进行游玩,我们都会选择保存,以便后面有空时,接着游玩。接下来,我们会学习一些Unity有关的存储方法。
- 前言最近在用 MVP + RxJava + Retrofit 写项目,觉得相对于其他的开发框架,这的确是给我们带来了很多方便,但是在网上搜寻
- 一、ListView该组件是android中最常用的一个UI组件,用于实现在屏幕上显示多个内容,以便于我们用手指来回翻转。先在layout中
- 使用范围synchronized使用上用于同步方法或者同步代码块在锁实现上是基于对象去实现使用中用于对static修饰的便是class类锁使
- 引言在Android应用中,列表有着举足轻重的地位,几乎所有的应用都有列表的身影,但是对于列表的交互体验一直是一个大问题。在性能比较好的设备
- 1. 实现原理将key映射到 2^32 - 1 的空间中,将这个数字的首尾相连,形成一个环计算节点(使用节点名称、编号、IP地址)的hash
- 什么是Kotlin?Kotlin是一种可以在 Java 虚拟机 (JVM) 上运行的开源编程语言。该语言可以在许多平台上运行。它是一种将面向
- 简介本文主要讲解java代码如何利用selenium操作浏览器上传和下载文件代码教程。上传文件常见的 web 页面的上传,一般使用 inpu
- /// <summary>/// 生成二维码/// </summary>/// <param name=&qu
- Java 反射机制实例详解一、JAVA是动态语言吗?一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,Ja
- 小伙伴私信我说想要研究下Spring的源码,想让我出一期教程来实现IDEA导入Spring源码,今天它来了~版本 :IDEA 2020.2.
- POM:<dependency> <groupId>com.baomidou</groupId&g
- 本文实例为大家分享了Android实现系统日历同步日程的具体代码,供大家参考,具体内容如下1、权限<uses-permission a
- 一、setting.xml文件的位置今天我们来谈谈Maven setting文件配置的禅定之道。不知道大家有没有听说过禅宗?嗯,没错,就是那
- 第一次接触到随机数还是在c语言里面 使用的是 rand(); 但是重新执行一次的时候会发现,诶,居然和上一次执行的结果是一样的,因为没有初始
- 环境:SpringBoot 2.0.4.RELEASE需求:很多Controller方法,刚进来要先获取当前登录用户的信息,以便做后续的用户
- Java集合删除元素ArrayList实例详解AbstractCollection集合类中有一个remove方法,该方法为了适配多种不同的集
- 封面GitHub传送门1.写在前面本文主要讲的是在Android原生Switch控件的基础上进行样式自定义,内容很简单,但是在实现的过程中还