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

标签:Java,事件处理,GUI
0
投稿

猜你喜欢

  • 完美解决Android客户端RSA解密部分乱码的问题

    2022-08-14 23:17:10
  • Android调用相机并将照片存储到sd卡上实现方法

    2023-11-06 00:41:41
  • C#获取全部目录和文件的简单实例

    2021-09-01 02:51:00
  • java 如何计算同比增长工具类

    2023-11-09 08:50:35
  • 详解配置spring-boot-actuator时候遇到的一些小问题

    2022-03-17 17:04:08
  • Android 判断是否连接成功了指定wifi

    2021-10-21 04:59:10
  • SpringBoot路径映射实现过程图解

    2023-11-13 04:01:11
  • JWT在OpenFeign调用中进行令牌中继详解

    2023-02-07 04:19:15
  • Java集合中的fail-fast(快速失败)机制详解

    2023-05-10 16:31:33
  • Java算法设计与分析分治算法

    2022-04-02 08:07:15
  • spring Bean的初始化过程解析

    2022-10-13 18:10:01
  • SpringBoot集成cache缓存的实现

    2023-11-27 16:37:39
  • Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法

    2021-10-06 22:37:24
  • Spring Data JPA 之 JpaRepository的使用

    2023-11-24 21:23:40
  • 自定义一个异常类模板的简单实例

    2022-04-30 02:53:14
  • ava实现一致性Hash算法

    2022-09-18 00:44:33
  • Android自定义View实现渐变色进度条

    2022-11-25 08:27:17
  • SpringMVC基于配置的异常处理器

    2023-01-19 15:34:33
  • Android 吸入动画效果实现分解

    2021-10-24 16:55:28
  • Spring Boot 2.7.6整合redis与低版本的区别

    2023-11-11 19:44:56
  • asp之家 软件编程 m.aspxhome.com